2015-06-19 69 views
7

我在項目中使用acid-state,我非常喜歡它。我很喜歡將簡單的Haskell數據類型的持久性添加到一個簡單的模板中。在Haskell中使用酸態事件日誌

據我所知,acid-state保留事件日誌,而不是在每次更新時寫出整個新狀態。我正在尋找的是一種讓我從應用程序中查看最近狀態變化的日誌的方式,作爲(只讀)列表。 (類似於git log,儘管我不需要分支或能夠返回到較舊的提交。)

當然,我可以寫入我自己的單獨日誌文件,包含所有狀態更改的詳細信息,甚至可以模擬我的數據作爲差異列表,但我更喜歡自動化的東西,並允許我儘可能使用純數據類型。

是否有類似於酸性狀態的庫,或者我可以使用酸性狀態的一些內部功能?

+0

查看Acid-State的源代碼,您可以看到如何閱讀事件文件以獲取使用更新方法和數據的條目列表,但是這些內容均未在API中公開。 –

回答

2

這裏是我結束了與方法:我已經使用圍繞Data.Acid.update的包裝(因爲它在限制IO單子運行),我意識到,包裝可以在事件存儲到自己的日誌

UpdateEvent update約束意味着SafeCopy updaterunPut . safePut我可以將其序列化爲ByteString。然而......這是一個二進制表示,並不是爲了人類可讀,而是希望能夠對其進行檢查。我意識到從磁盤讀取酸狀態事件日誌會有同樣的問題。

因此,我將Show update添加到我的包裝的約束。在使用我加狀態的每一個地方:

{-# LANGUAGE StandaloneDeriving #-} 

... 

$(makeAcidic ''State ['update]) 

deriving instance Show Update 

(StandaloneDeriving可能有點爭議,但它不會在這裏造成孤兒的問題,因爲它是在同一個文件。)

在我現在在更新中調用show並將結果寫入我自己的日誌文件。當然,這會失去更新的原子性:應用程序可能會在update調用和我自己的日誌調用之間崩潰,但我願意接受這種風險。