2015-06-19 19 views
7

Sto usando acid-state in un progetto e mi piace molto. Mi piace quanto sia facile aggiungere persistenza ai semplici tipi di dati Haskell senza molto standard.Usa il registro degli eventi come stato degli acidi in Haskell

Per quanto ne so, lo stato acido mantiene un registro degli eventi, invece di scrivere l'intero nuovo stato su ogni aggiornamento. Quello che sto cercando è un modo per riesaminare un registro delle recenti modifiche allo stato dall'interno dell'applicazione, come elenco (di sola lettura). (Qualcosa come git log, anche se non ho bisogno di ramificazioni o di tornare a un commit precedente.)

Naturalmente posso scrivere nel mio file di registro separato con i dettagli di tutti i cambiamenti di stato, o anche il mio modello dati come una lista di diff, ma preferisco qualcosa che sia automatico e mi permetta di usare il più semplice datatypes il più possibile.

Esiste una libreria simile allo stato acido, o forse una funzionalità interna di stato acido che potrei usare per questo?

+0

Guardando il codice sorgente per Acid-State, è possibile vedere come leggere il file degli eventi per ottenere un elenco di voci con il metodo di aggiornamento utilizzato e i dati, ma nessuno di questi è esposto nell'API. –

risposta

2

Ecco l'approccio che ho finito con:

ero già usando un wrapper Data.Acid.update (perché è in esecuzione in una monade con ristretta IO) e ho capito che l'involucro potrebbe memorizzare l'evento al mio registro. Il vincolo UpdateEvent update implica SafeCopy update e con runPut . safePut È possibile serializzarlo a un valore ByteString. Comunque ... questa è una rappresentazione binaria, non intesa per essere leggibile, e volevo essere in grado di esaminarla. Mi sono reso conto che leggere il registro degli eventi di stato acido dal disco avrebbe lo stesso problema.

Quindi ho aggiunto Show update ai vincoli del mio wrapper. In ogni luogo che utilizza lo stato ho aggiunto:

{-# LANGUAGE StandaloneDeriving #-} 

... 

$(makeAcidic ''State ['update]) 

deriving instance Show Update 

(StandaloneDeriving potrebbe essere un po 'discutibile, ma non causare un problema con gli orfani qui, come è nello stesso file.)

Nel wrapper Ora chiamo show sull'aggiornamento e scrivo il risultato nel mio file di registro. Ovviamente questo perde l'atomicità dell'aggiornamento: è possibile che l'applicazione si blocchi tra la chiamata update e la mia chiamata di registrazione, ma sono disposto ad accettare tale rischio.