2015-06-19 34 views
7

Я использую acid-state в проекте, и мне это очень нравится. Мне нравится, как легко добавлять постоянство к простым типам Haskell без особого шаблона.Использовать кислотное состояние как журнал событий в Haskell

Насколько я понимаю, кислотное состояние хранит журнал событий, а не записывает все новое состояние при каждом обновлении. То, что я ищу, - это способ просмотреть журнал последних изменений состояния из приложения в виде списка (только для чтения). (Что-то вроде git log, хотя мне не нужно разветвляться или быть в состоянии вернуться к более раннему фиксации.)

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

Есть ли библиотека, подобная кислотной форме, или, возможно, некоторые внутренние функциональные возможности кислотного состояния, которые я мог бы использовать для этого?

+0

Рассматривая исходный код для Acid-State, вы можете увидеть, как читать файл событий, чтобы получить список записей с использованием метода обновления и данных, но ни один из них не отображается в API. –

ответ

2

Вот подход, который я закончил с:

Я уже использовал обертку вокруг Data.Acid.update (потому что он работает в монады с ограниченной IO), и я понял, что оболочка может хранить событие в моей собственный журнал. Ограничение UpdateEvent update подразумевает SafeCopy update и с runPut . safePut Я могу сериализовать это на ByteString. Однако ... это двоичное представление, не предназначенное для удобочитаемости, и я хотел бы просмотреть его. Я понял, что чтение журнала событий с кислотным состоянием с диска будет иметь такую ​​же проблему.

Поэтому я добавил Show update ограничениям моей обертки. На каждом месте, которое использует состояние я добавил:

{-# LANGUAGE StandaloneDeriving #-} 

... 

$(makeAcidic ''State ['update]) 

deriving instance Show Update 

(StandaloneDeriving может быть немного спорным, но это не вызывает проблем с детьми-сиротами здесь, как это в том же файле.)

В wrapper Теперь я вызываю show на обновление и записываю результат в свой собственный файл журнала. Конечно, это теряет атомарность обновления: возможно, приложение вылетает между вызовом update и моим собственным вызовом регистрации, но я готов принять этот риск.