-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 ).