-module(eventsourcing). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]). -export([new/2, execute_with_metadata/4, execute/3, add_query/2, load_events/2, load_aggregate/2]). -export_type([aggregate/4, aggregate_context/4, event_envelop/1, event_sourcing_error/1, event_sourcing/6, event_store/5]). -type aggregate(OFB, OFC, OFD, OFE) :: {aggregate, OFB, fun((OFB, OFC) -> {ok, list(OFD)} | {error, OFE}), fun((OFB, OFD) -> OFB)}. -type aggregate_context(OFF, OFG, OFH, OFI) :: {aggregate_context, binary(), aggregate(OFF, OFG, OFH, OFI), integer()}. -type event_envelop(OFJ) :: {memory_store_event_envelop, binary(), integer(), OFJ, list({binary(), binary()})} | {serialized_event_envelop, binary(), integer(), OFJ, list({binary(), binary()}), binary(), binary(), binary()}. -type event_sourcing_error(OFK) :: {domain_error, OFK} | implementation_error | entity_not_found. -opaque event_sourcing(OFL, OFM, OFN, OFO, OFP, OFQ) :: {event_sourcing, event_store(OFL, OFM, OFN, OFO, OFP), list(fun((binary(), list(event_envelop(OFO))) -> nil))} | {gleam_phantom, OFQ}. -type event_store(OFR, OFS, OFT, OFU, OFV) :: {event_store, OFR, fun((OFR, binary()) -> aggregate_context(OFS, OFT, OFU, OFV)), fun((OFR, binary()) -> list(event_envelop(OFU))), fun((OFR, aggregate_context(OFS, OFT, OFU, OFV), list(OFU), list({binary(), binary()})) -> list(event_envelop(OFU)))}. -file("/Users/renata-amutio/Projects/renatillas/eventsourcing/src/eventsourcing.gleam", 105). -spec new( event_store(OMY, OMZ, ONA, ONB, ONC), list(fun((binary(), list(event_envelop(ONB))) -> nil)) ) -> event_sourcing(OMY, OMZ, ONA, ONB, ONC, any()). new(Event_store, Queries) -> {event_sourcing, Event_store, Queries}. -file("/Users/renata-amutio/Projects/renatillas/eventsourcing/src/eventsourcing.gleam", 130). -spec execute_with_metadata( event_sourcing(any(), any(), OHC, any(), OHE, any()), binary(), OHC, list({binary(), binary()}) ) -> {ok, nil} | {error, event_sourcing_error(OHE)}. execute_with_metadata(Event_sourcing, Aggregate_id, Command, Metadata) -> 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:'try'( begin _pipe = (erlang:element(3, Aggregate))(Entity, Command), gleam@result:map_error( _pipe, fun(Error) -> {domain_error, Error} end ) end, fun(Events) -> _pipe@1 = Events, gleam@list:map( _pipe@1, fun(_capture) -> (erlang:element(4, Aggregate))(Entity, _capture) end ), Commited_events = (erlang:element( 5, erlang:element(2, Event_sourcing) ))( erlang:element(2, erlang:element(2, Event_sourcing)), Aggregate_context, Events, Metadata ), _pipe@2 = erlang:element(3, Event_sourcing), gleam@list:map( _pipe@2, fun(Query) -> Query(Aggregate_id, Commited_events) end ), {ok, nil} end ). -file("/Users/renata-amutio/Projects/renatillas/eventsourcing/src/eventsourcing.gleam", 115). -spec execute( event_sourcing(any(), any(), OGN, any(), OGP, any()), binary(), OGN ) -> {ok, nil} | {error, event_sourcing_error(OGP)}. execute(Event_sourcing, Aggregate_id, Command) -> execute_with_metadata(Event_sourcing, Aggregate_id, Command, []). -file("/Users/renata-amutio/Projects/renatillas/eventsourcing/src/eventsourcing.gleam", 167). -spec add_query( event_sourcing(OHQ, OHR, OHS, OHT, OHU, any()), fun((binary(), list(event_envelop(OHT))) -> nil) ) -> event_sourcing(OHQ, OHR, OHS, OHT, OHU, any()). add_query(Eventsourcing, Query) -> _record = Eventsourcing, {event_sourcing, erlang:element(2, _record), [Query | erlang:element(3, Eventsourcing)]}. -file("/Users/renata-amutio/Projects/renatillas/eventsourcing/src/eventsourcing.gleam", 181). -spec load_events( event_sourcing(any(), any(), any(), OIH, any(), any()), binary() ) -> list(event_envelop(OIH)). load_events(Eventsourcing, Aggregate_id) -> (erlang:element(4, erlang:element(2, Eventsourcing)))( erlang:element(2, erlang:element(2, Eventsourcing)), Aggregate_id ). -file("/Users/renata-amutio/Projects/renatillas/eventsourcing/src/eventsourcing.gleam", 198). -spec load_aggregate( event_sourcing(any(), OIT, any(), any(), any(), any()), binary() ) -> OIT. load_aggregate(Eventsourcing, Aggregate_id) -> erlang:element( 2, erlang:element( 3, (erlang:element(3, erlang:element(2, Eventsourcing)))( erlang:element(2, erlang:element(2, Eventsourcing)), Aggregate_id ) ) ).