Current section

Files

Jump to
eventsourcing src eventsourcing.erl
Raw

src/eventsourcing.erl

-module(eventsourcing).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([new/2, execute/3]).
-export_type([aggregate/4, aggregate_context/4, event_envelop/1, event_sourcing/6, event_store/5]).
-type aggregate(NRA, NRB, NRC, NRD) :: {aggregate,
NRA,
fun((NRA, NRB) -> {ok, list(NRC)} | {error, NRD}),
fun((NRA, NRC) -> NRA)}.
-type aggregate_context(NRE, NRF, NRG, NRH) :: {aggregate_context,
binary(),
aggregate(NRE, NRF, NRG, NRH),
integer()}.
-type event_envelop(NRI) :: {memory_store_event_envelop,
binary(),
integer(),
NRI} |
{serialized_event_envelop,
binary(),
integer(),
NRI,
binary(),
binary(),
binary()}.
-opaque event_sourcing(NRJ, NRK, NRL, NRM, NRN, NRO) :: {event_sourcing,
event_store(NRJ, NRK, NRL, NRM, NRN),
list(fun((binary(), list(event_envelop(NRM))) -> nil))} |
{gleam_phantom, NRO}.
-type event_store(NRP, NRQ, NRR, NRS, NRT) :: {event_store,
NRP,
fun((NRP, binary()) -> aggregate_context(NRQ, NRR, NRS, NRT)),
fun((NRP, aggregate_context(NRQ, NRR, NRS, NRT), list(NRS)) -> list(event_envelop(NRS)))}.
-spec new(
event_store(NVB, NVC, NVD, NVE, NVF),
list(fun((binary(), list(event_envelop(NVE))) -> nil))
) -> event_sourcing(NVB, NVC, NVD, NVE, NVF, any()).
new(Event_store, Queries) ->
{event_sourcing, Event_store, Queries}.
-spec execute(
event_sourcing(any(), any(), NSL, any(), NSN, any()),
binary(),
NSL
) -> {ok, nil} | {error, NSN}.
execute(Event_sourcing, Aggregate_id, Command) ->
Aggregate_context = (erlang:element(3, erlang:element(2, Event_sourcing)))(
erlang:element(2, erlang:element(2, Event_sourcing)),
Aggregate_id
),
Aggregate = erlang:element(3, Aggregate_context),
Entity = erlang:element(2, Aggregate),
gleam@result:map(
(erlang:element(3, Aggregate))(Entity, Command),
fun(Events) ->
_pipe = Events,
gleam@list:map(
_pipe,
fun(_capture) ->
(erlang:element(4, Aggregate))(Entity, _capture)
end
),
Commited_events = (erlang:element(
4,
erlang:element(2, Event_sourcing)
))(
erlang:element(2, erlang:element(2, Event_sourcing)),
Aggregate_context,
Events
),
_pipe@1 = erlang:element(3, Event_sourcing),
gleam@list:map(
_pipe@1,
fun(Query) -> Query(Aggregate_id, Commited_events) end
),
nil
end
).