-module(fp2@monoid). -compile(no_auto_import). -export([monoid_string/0, concat_all/1, to_semigroup/1, from_semigroup/2]). -export_type([monoid/1]). -type monoid(EOC) :: {monoid, fun((EOC, EOC) -> EOC), EOC}. -spec monoid_string() -> monoid(binary()). monoid_string() -> {monoid, fun(A, B) -> gleam@string:concat([A, B]) end, <<""/utf8>>}. -spec concat_all(monoid(EOE)) -> fun((list(EOE)) -> EOE). concat_all(M) -> fun(Ass) -> gleam@list:fold(Ass, erlang:element(3, M), erlang:element(2, M)) end. -spec to_semigroup(monoid(EOH)) -> fp2@semigroup:semigroup(EOH). to_semigroup(M) -> {semigroup, erlang:element(2, M)}. -spec from_semigroup(fp2@semigroup:semigroup(EOK), EOK) -> monoid(EOK). from_semigroup(S, Empty) -> {monoid, erlang:element(2, S), Empty}.