Skip to content

Instantly share code, notes, and snippets.

@dasch
Created June 17, 2016 18:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dasch/73e9cad8e9b01511e78fa808ce06c67a to your computer and use it in GitHub Desktop.
Save dasch/73e9cad8e9b01511e78fa808ce06c67a to your computer and use it in GitHub Desktop.
module EventSourcing exposing
type alias EventRecord a =
{ timestamp : Time
, eventNumber : Int
, event : a
}
type alias EventLog a =
{ aggregateId : String
, version : Int
, events : List (EventRecord a)
}
type alias Model a =
{ eventLog : EventLog a
, currentTime : Maybe Time
}
init : String -> Model a
init aggregateId =
{ eventLog =
{ aggregateId = aggregateId
, version = 0
, events = []
}
, currentTime = Nothing
}
type Cmd a = CommitEvent a | UpdateTime Time
update cmd model =
case cmd of
UpdateTime time ->
{ model | currentTime = Just time }
CommitEvent event ->
{ model | eventLog = commitEvent event model.currentTime model.eventLog }
commitEvent : a -> Time -> EventLog a -> EventLog a
commitEvent event timestamp eventLog =
let
eventNumber = eventLog.version + 1
eventRecord =
{ eventNumber = eventNumber
, timestamp = timestamp
, event = event
}
in
{ eventLog
| version = eventLog.version + 1
, events = eventLog.events ++ [eventRecord]
}
subscriptions model =
[ Time.every Time.second UpdateTime
]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment