Я создал небольшой игровой движок для управления доской из квадратов (в настоящее время используется для игры в жизнь Конвея). Доступ ко всем данным осуществляется через линзы из fclabels и State. Движок объединяет пользовательский ввод и графический рендеринг (обычный игровой цикл).
Вычисления между кадрами иногда могут выполняться медленно и долго. Поэтому я хотел бы использовать параллелизм для управления квадратами, используя STM TVar.
Мои данные в настоящее время представлены следующим образом:
data World = World {
… -- window configuration, not important
, _squares :: TVar [Square]
}
mkLabels [''World] -- creates labels, similar to mkLenses
Мои функции выполняются в игровой монаде, которая определяется следующим образом:
type Game a = StateT World IO a
Использование монадических версий меток. Я использую геттеры и сеттеры внутри своей монады.
Я хотел бы знать, есть ли способ как-то написать новые метки, которые ведут себя следующим образом:
gets :: MonadState f m => Lens (->) f o -> m o
…
puts :: MonadState f m => Lens (->) f o -> o -> m ()
Но это заботится о STM (gets будет включать readTVar, puts будет включать writeTvar и т. д.).