acid-state-0.5.2: Add ACID guarantees to any serializable Haskell data structure.

Portabilitynon-portable (uses GHC extensions)
Maintainerlemmih@gmail.com

Data.Acid.Memory

Description

AcidState container without a transaction log. Mostly used for testing.

Synopsis

Documentation

class SafeCopy st => IsAcidic st whereSource

Methods

acidEventsSource

Arguments

:: [Event st]

List of events capable of updating or querying the state.

data AcidState st Source

State container offering full ACID (Atomicity, Consistency, Isolation and Durability) guarantees.

Atomicity
State changes are all-or-nothing. This is what you'd expect of any state variable in Haskell and AcidState doesn't change that.
Consistency
No event or set of events will break your data invariants.
Isolation
Transactions cannot interfere with each other even when issued in parallel.
Durability
Successful transaction are guaranteed to survive system failure (both hardware and software).

data Event st whereSource

We distinguish between events that modify the state and those that do not.

UpdateEvents are executed in a MonadState context and have to be serialized to disk before they are considered durable.

QueryEvents are executed in a MonadReader context and obviously do not have to be serialized to disk.

Constructors

UpdateEvent :: UpdateEvent ev => (ev -> Update (EventState ev) (EventResult ev)) -> Event (EventState ev) 
QueryEvent :: QueryEvent ev => (ev -> Query (EventState ev) (EventResult ev)) -> Event (EventState ev) 

type EventResult ev = MethodResult evSource

Events return the same thing as Methods. The exact type of EventResult depends on the event.

class Method ev => UpdateEvent ev Source

All UpdateEvents are also Methods.

class Method ev => QueryEvent ev Source

All QueryEvents are also Methods.

data Update st a Source

Context monad for Update events.

Instances

data Query st a Source

Context monad for Query events.

Instances

openAcidStateSource

Arguments

:: IsAcidic st 
=> st

Initial state value.

-> IO (AcidState st) 

Create an AcidState given an initial value.

closeAcidState :: AcidState st -> IO ()Source

Close an AcidState and associated logs. Any subsequent usage of the AcidState will throw an exception.

createCheckpoint :: SafeCopy st => AcidState st -> IO ()Source

This is a nop with the memory backend.

createCheckpointAndClose :: SafeCopy st => AcidState st -> IO ()Source

This is an alias for closeAcidState when using the memory backend.

update :: UpdateEvent event => AcidState (EventState event) -> event -> IO (EventResult event)Source

Issue an Update event and wait for its result. Once this call returns, you are guaranteed that the changes to the state are durable. Events may be issued in parallel.

It's a run-time error to issue events that aren't supported by the AcidState.

scheduleUpdate :: UpdateEvent event => AcidState (EventState event) -> event -> IO (MVar (EventResult event))Source

Issue an Update event and return immediately. The event is not durable before the MVar has been filled but the order of events is honored. The behavior in case of exceptions is exactly the same as for update.

If EventA is scheduled before EventB, EventA will be executed before EventB:

do scheduleUpdate acid EventA
   scheduleUpdate acid EventB

query :: QueryEvent event => AcidState (EventState event) -> event -> IO (EventResult event)Source

Issue a Query event and wait for its result. Events may be issued in parallel.

update' :: (UpdateEvent event, MonadIO m) => AcidState (EventState event) -> event -> m (EventResult event)Source

Same as update but lifted into any monad capable of doing IO.

query' :: (QueryEvent event, MonadIO m) => AcidState (EventState event) -> event -> m (EventResult event)Source

Same as query but lifted into any monad capable of doing IO.

runQuery :: Query st a -> Update st aSource

Run a query in the Update Monad.