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/5, add_query/2, load_events/2, load_aggregate/2, execute_with_metadata/4, execute/3]).
-export_type([aggregate/4, event_envelop/1, event_sourcing_error/1, event_sourcing/5, event_store/5]).
-type aggregate(OFB, OFC, OFD, OFE) :: {aggregate, binary(), OFB, integer()} |
{gleam_phantom, OFC, OFD, OFE}.
-type event_envelop(OFF) :: {memory_store_event_envelop,
binary(),
integer(),
OFF,
list({binary(), binary()})} |
{serialized_event_envelop,
binary(),
integer(),
OFF,
list({binary(), binary()}),
binary(),
binary(),
binary()}.
-type event_sourcing_error(OFG) :: {domain_error, OFG} |
{event_store_error, binary()}.
-opaque event_sourcing(OFH, OFI, OFJ, OFK, OFL) :: {event_sourcing,
event_store(OFH, OFI, OFJ, OFK, OFL),
list(fun((binary(), list(event_envelop(OFK))) -> nil)),
fun((OFI, OFJ) -> {ok, list(OFK)} | {error, OFL}),
fun((OFI, OFK) -> OFI),
OFI}.
-type event_store(OFM, OFN, OFO, OFP, OFQ) :: {event_store,
OFM,
fun((OFM, binary()) -> list(event_envelop(OFP))),
fun((OFM, aggregate(OFN, OFO, OFP, OFQ), list(OFP), list({binary(),
binary()})) -> list(event_envelop(OFP)))}.
-file("/Users/renata-amutio/Projects/renatillas/eventsourcing/src/eventsourcing.gleam", 83).
-spec new(
event_store(OMN, OGH, OMP, OMQ, OMR),
list(fun((binary(), list(event_envelop(OMQ))) -> nil)),
fun((OGH, OMP) -> {ok, list(OMQ)} | {error, OMR}),
fun((OGH, OMQ) -> OGH),
OGH
) -> event_sourcing(OMN, OGH, OMP, OMQ, OMR).
new(Event_store, Queries, Handle, Apply, Empty_state) ->
{event_sourcing, Event_store, Queries, Handle, Apply, Empty_state}.
-file("/Users/renata-amutio/Projects/renatillas/eventsourcing/src/eventsourcing.gleam", 137).
-spec execute_with_aggregate_context(
event_sourcing(any(), OHL, OHM, OHN, OHO),
aggregate(OHL, OHM, OHN, OHO),
OHM,
list({binary(), binary()})
) -> {ok, nil} | {error, event_sourcing_error(OHO)}.
execute_with_aggregate_context(Eventsourcing, Aggregate, Command, Metadata) ->
Entity = erlang:element(3, Aggregate),
gleam@result:'try'(
begin
_pipe = (erlang:element(4, Eventsourcing))(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(5, Eventsourcing))(Entity, _capture)
end
),
Commited_events = (erlang:element(
4,
erlang:element(2, Eventsourcing)
))(
erlang:element(2, erlang:element(2, Eventsourcing)),
Aggregate,
Events,
Metadata
),
_pipe@2 = erlang:element(3, Eventsourcing),
gleam@list:map(
_pipe@2,
fun(Query) ->
Query(erlang:element(2, Aggregate), Commited_events)
end
),
{ok, nil}
end
).
-file("/Users/renata-amutio/Projects/renatillas/eventsourcing/src/eventsourcing.gleam", 195).
-spec add_query(
event_sourcing(OIT, OIU, OIV, OIW, OIX),
fun((binary(), list(event_envelop(OIW))) -> nil)
) -> event_sourcing(OIT, OIU, OIV, OIW, OIX).
add_query(Eventsourcing, Query) ->
_record = Eventsourcing,
{event_sourcing,
erlang:element(2, _record),
[Query | erlang:element(3, Eventsourcing)],
erlang:element(4, _record),
erlang:element(5, _record),
erlang:element(6, _record)}.
-file("/Users/renata-amutio/Projects/renatillas/eventsourcing/src/eventsourcing.gleam", 209).
-spec load_events(event_sourcing(any(), any(), any(), OJI, any()), binary()) -> list(event_envelop(OJI)).
load_events(Eventsourcing, Aggregate_id) ->
(erlang:element(3, erlang:element(2, Eventsourcing)))(
erlang:element(2, erlang:element(2, Eventsourcing)),
Aggregate_id
).
-file("/Users/renata-amutio/Projects/renatillas/eventsourcing/src/eventsourcing.gleam", 167).
-spec load_aggregate(event_sourcing(any(), OID, OIE, OIF, OIG), binary()) -> {ok,
aggregate(OID, OIE, OIF, OIG)} |
{error, event_sourcing_error(OIG)}.
load_aggregate(Eventsourcing, Aggregate_id) ->
Commited_events = load_events(Eventsourcing, Aggregate_id),
{Instance, Sequence@1} = gleam@list:fold(
Commited_events,
{erlang:element(6, Eventsourcing), 0},
fun(Aggregate_and_sequence, Event_envelop) ->
{Aggregate, Sequence} = Aggregate_and_sequence,
{(erlang:element(5, Eventsourcing))(
Aggregate,
erlang:element(4, Event_envelop)
),
Sequence + 1}
end
),
{ok, {aggregate, Aggregate_id, Instance, Sequence@1}}.
-file("/Users/renata-amutio/Projects/renatillas/eventsourcing/src/eventsourcing.gleam", 112).
-spec execute_with_metadata(
event_sourcing(any(), any(), OGY, any(), OHA),
binary(),
OGY,
list({binary(), binary()})
) -> {ok, nil} | {error, event_sourcing_error(OHA)}.
execute_with_metadata(Event_sourcing, Aggregate_id, Command, Metadata) ->
Aggregate_context = load_aggregate(Event_sourcing, Aggregate_id),
case Aggregate_context of
{ok, Aggregate_context@1} ->
execute_with_aggregate_context(
Event_sourcing,
Aggregate_context@1,
Command,
Metadata
);
{error, Error} ->
{error, Error}
end.
-file("/Users/renata-amutio/Projects/renatillas/eventsourcing/src/eventsourcing.gleam", 94).
-spec execute(event_sourcing(any(), any(), OGL, any(), OGN), binary(), OGL) -> {ok,
nil} |
{error, event_sourcing_error(OGN)}.
execute(Event_sourcing, Aggregate_id, Command) ->
execute_with_metadata(Event_sourcing, Aggregate_id, Command, []).