Контейнер для Haskell TVars

У меня есть игровой сервер, который создает поток для каждого клиента с помощью forkIO. Я хочу, например, поделиться со всеми списком клиентов и списком монстров.

Моя первая идея заключалась в том, чтобы иметь один контейнер TVar для типа данных, содержащего оба списка, но, скажем, два потока одновременно изменяют клиента и монстра, что приведет к откату одного из них, если я правильно понял эту часть. Что было бы ненужным откатом.

Вторая идея заключалась в том, чтобы создать списки TVars, а затем просто передать их в качестве аргументов, но я бы предпочел, чтобы они были в контейнере, чтобы код оставался чистым и легко управляемым, если нужно добавить больше списков.

Есть ли способ передать пару TVar в контейнере, или я слишком много думаю над первой идеей?


person Plankt    schedule 11.04.2012    source источник


Ответы (1)


Как насчет того, чтобы просто создать содержащий тип данных, содержащий 2 TVar? Это не сильно отличается от простой передачи TVar в качестве отдельных аргументов, но сохраняет их «упакованными» вместе, что вы, кажется, предпочитаете.

data GameState = GameState {clients :: TVar [Client], monsters :: TVar [Monster]}
person bitbucket    schedule 11.04.2012