-module(galchemy@orm@identity_map). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src\\galchemy\\orm\\identity_map.gleam"). -export([empty/0, values/1, values_for_table/2, entries/1, get/3, insert/2, remove/3, upsert/2]). -export_type([identity_entry/0, identity_map/0, identity_map_error/0]). -type identity_entry() :: {identity_entry, galchemy@schema@relation:table_ref(), galchemy@session@unit_of_work:identity(), galchemy@orm@entity:entity()}. -type identity_map() :: {identity_map, list(identity_entry())}. -type identity_map_error() :: {entity_error, galchemy@orm@entity:entity_error()} | {duplicate_identity, galchemy@schema@relation:table_ref(), galchemy@session@unit_of_work:identity()}. -file("src\\galchemy\\orm\\identity_map.gleam", 24). -spec empty() -> identity_map(). empty() -> {identity_map, []}. -file("src\\galchemy\\orm\\identity_map.gleam", 95). -spec values(identity_map()) -> list(galchemy@orm@entity:entity()). values(Map) -> gleam@list:map( erlang:element(2, Map), fun(Entry) -> erlang:element(4, Entry) end ). -file("src\\galchemy\\orm\\identity_map.gleam", 99). -spec values_for_table(identity_map(), galchemy@schema@relation:table_ref()) -> list(galchemy@orm@entity:entity()). values_for_table(Map, Table) -> _pipe = erlang:element(2, Map), _pipe@1 = gleam@list:filter( _pipe, fun(Entry) -> erlang:element(2, Entry) =:= Table end ), gleam@list:map(_pipe@1, fun(Entry@1) -> erlang:element(4, Entry@1) end). -file("src\\galchemy\\orm\\identity_map.gleam", 108). -spec entries(identity_map()) -> list(identity_entry()). entries(Map) -> erlang:element(2, Map). -file("src\\galchemy\\orm\\identity_map.gleam", 112). -spec find_entry( list(identity_entry()), galchemy@schema@relation:table_ref(), galchemy@session@unit_of_work:identity() ) -> gleam@option:option(identity_entry()). find_entry(Entries, Table, Identity) -> case Entries of [] -> none; [Entry | Rest] -> case (erlang:element(2, Entry) =:= Table) andalso (erlang:element( 3, Entry ) =:= Identity) of true -> {some, Entry}; false -> find_entry(Rest, Table, Identity) end end. -file("src\\galchemy\\orm\\identity_map.gleam", 76). -spec get( identity_map(), galchemy@schema@relation:table_ref(), galchemy@session@unit_of_work:identity() ) -> gleam@option:option(galchemy@orm@entity:entity()). get(Map, Table, Identity) -> case find_entry(erlang:element(2, Map), Table, Identity) of {some, Entry} -> {some, erlang:element(4, Entry)}; none -> none end. -file("src\\galchemy\\orm\\identity_map.gleam", 28). -spec insert(identity_map(), galchemy@orm@entity:entity()) -> {ok, identity_map()} | {error, identity_map_error()}. insert(Map, Next_entity) -> case galchemy@orm@entity:identity(Next_entity) of {error, Error} -> {error, {entity_error, Error}}; {ok, Next_identity} -> Table_ref = erlang:element(2, erlang:element(2, Next_entity)), case get(Map, Table_ref, Next_identity) of {some, _} -> {error, {duplicate_identity, Table_ref, Next_identity}}; none -> {ok, {identity_map, lists:append( erlang:element(2, Map), [{identity_entry, Table_ref, Next_identity, Next_entity}] )}} end end. -file("src\\galchemy\\orm\\identity_map.gleam", 128). -spec remove_entry( list(identity_entry()), galchemy@schema@relation:table_ref(), galchemy@session@unit_of_work:identity() ) -> list(identity_entry()). remove_entry(Entries, Table, Identity) -> case Entries of [] -> []; [Entry | Rest] -> case (erlang:element(2, Entry) =:= Table) andalso (erlang:element( 3, Entry ) =:= Identity) of true -> Rest; false -> [Entry | remove_entry(Rest, Table, Identity)] end end. -file("src\\galchemy\\orm\\identity_map.gleam", 87). -spec remove( identity_map(), galchemy@schema@relation:table_ref(), galchemy@session@unit_of_work:identity() ) -> identity_map(). remove(Map, Table, Identity) -> {identity_map, remove_entry(erlang:element(2, Map), Table, Identity)}. -file("src\\galchemy\\orm\\identity_map.gleam", 144). -spec upsert_entry(list(identity_entry()), identity_entry()) -> list(identity_entry()). upsert_entry(Entries, Next_entry) -> case Entries of [] -> [Next_entry]; [Entry | Rest] -> case (erlang:element(2, Entry) =:= erlang:element(2, Next_entry)) andalso (erlang:element(3, Entry) =:= erlang:element(3, Next_entry)) of true -> [Next_entry | Rest]; false -> [Entry | upsert_entry(Rest, Next_entry)] end end. -file("src\\galchemy\\orm\\identity_map.gleam", 56). -spec upsert(identity_map(), galchemy@orm@entity:entity()) -> {ok, identity_map()} | {error, identity_map_error()}. upsert(Map, Next_entity) -> case galchemy@orm@entity:identity(Next_entity) of {error, Error} -> {error, {entity_error, Error}}; {ok, Next_identity} -> {ok, {identity_map, upsert_entry( erlang:element(2, Map), {identity_entry, erlang:element(2, erlang:element(2, Next_entity)), Next_identity, Next_entity} )}} end.