-module(fp2@semigroup). -compile(no_auto_import). -export([reverse/1, intercalate/1, struct1/2, struct2/3, struct3/4, tuple1/1, tuple2/2, tuple3/3, min/1, max/1, constant/1, first/0, last/0, concat_all/2]). -spec reverse(fp2@models:semigroup(ERX)) -> fp2@models:semigroup(ERX). reverse(S) -> {semigroup, fun(X, Y) -> (erlang:element(2, S))(Y, X) end}. -spec intercalate(ESA) -> fun((fp2@models:semigroup(ESA)) -> fp2@models:semigroup(ESA)). intercalate(Middle) -> fun(S) -> {semigroup, fun(X, Y) -> (erlang:element(2, S))(X, (erlang:element(2, S))(Middle, Y)) end} end. -spec struct1(fp2@defunc:defunc1(ESC, ESD), fp2@models:semigroup(ESC)) -> fp2@models:semigroup(ESD). struct1(Defunc, Semigroup1) -> {semigroup, fun(X, Y) -> X@1 = (erlang:element(3, Defunc))(X), Y@1 = (erlang:element(3, Defunc))(Y), (erlang:element(2, Defunc))( (erlang:element(2, Semigroup1))( erlang:element(1, X@1), erlang:element(1, Y@1) ) ) end}. -spec struct2( fp2@defunc:defunc2(ESI, ESJ, ESK), fp2@models:semigroup(ESI), fp2@models:semigroup(ESJ) ) -> fp2@models:semigroup(ESK). struct2(Defunc, Semigroup1, Semigroup2) -> {semigroup, fun(X, Y) -> X@1 = (erlang:element(3, Defunc))(X), Y@1 = (erlang:element(3, Defunc))(Y), (erlang:element(2, Defunc))( (erlang:element(2, Semigroup1))( erlang:element(1, X@1), erlang:element(1, Y@1) ), (erlang:element(2, Semigroup2))( erlang:element(2, X@1), erlang:element(2, Y@1) ) ) end}. -spec struct3( fp2@defunc:defunc3(ESR, ESS, EST, ESU), fp2@models:semigroup(ESR), fp2@models:semigroup(ESS), fp2@models:semigroup(EST) ) -> fp2@models:semigroup(ESU). struct3(Defunc, Semigroup1, Semigroup2, Semigroup3) -> {semigroup, fun(X, Y) -> X@1 = (erlang:element(3, Defunc))(X), Y@1 = (erlang:element(3, Defunc))(Y), (erlang:element(2, Defunc))( (erlang:element(2, Semigroup1))( erlang:element(1, X@1), erlang:element(1, Y@1) ), (erlang:element(2, Semigroup2))( erlang:element(2, X@1), erlang:element(2, Y@1) ), (erlang:element(2, Semigroup3))( erlang:element(3, X@1), erlang:element(3, Y@1) ) ) end}. -spec tuple1(fp2@models:semigroup(ETD)) -> fp2@models:semigroup({ETD}). tuple1(Semigroup1) -> {semigroup, fun(X, Y) -> {(erlang:element(2, Semigroup1))( erlang:element(1, X), erlang:element(1, Y) )} end}. -spec tuple2(fp2@models:semigroup(ETG), fp2@models:semigroup(ETI)) -> fp2@models:semigroup({ETG, ETI}). tuple2(Semigroup1, Semigroup2) -> {semigroup, fun(X, Y) -> {(erlang:element(2, Semigroup1))( erlang:element(1, X), erlang:element(1, Y) ), (erlang:element(2, Semigroup2))( erlang:element(2, X), erlang:element(2, Y) )} end}. -spec tuple3( fp2@models:semigroup(ETL), fp2@models:semigroup(ETN), fp2@models:semigroup(ETP) ) -> fp2@models:semigroup({ETL, ETN, ETP}). tuple3(Semigroup1, Semigroup2, Semigroup3) -> {semigroup, fun(X, Y) -> {(erlang:element(2, Semigroup1))( erlang:element(1, X), erlang:element(1, Y) ), (erlang:element(2, Semigroup2))( erlang:element(2, X), erlang:element(2, Y) ), (erlang:element(2, Semigroup3))( erlang:element(3, X), erlang:element(3, Y) )} end}. -spec min(fp2@models:ord(ETS)) -> fp2@models:semigroup(ETS). min(O) -> {semigroup, fp2@ord:min(O)}. -spec max(fp2@models:ord(ETV)) -> fp2@models:semigroup(ETV). max(O) -> {semigroup, fp2@ord:max(O)}. -spec constant(ETY) -> fp2@models:semigroup(ETY). constant(It) -> {semigroup, fun(_, _) -> It end}. -spec first() -> fp2@models:semigroup(any()). first() -> {semigroup, fun(X, _) -> X end}. -spec last() -> fp2@models:semigroup(any()). last() -> {semigroup, fun(_, Y) -> Y end}. -spec concat_all(fp2@models:semigroup(EUE), EUE) -> fun((list(EUE)) -> EUE). concat_all(M, Empty) -> fun(Ass) -> gleam@list:fold(Ass, Empty, erlang:element(2, M)) end.