-module(lustre@effect). -compile([no_auto_import, nowarn_unused_vars]). -export([from/1, none/0, batch/1, map/2]). -export_type([effect/1]). -opaque effect(EXE) :: {effect, list(fun((fun((EXE) -> nil)) -> nil))}. -spec from(fun((fun((EXF) -> nil)) -> nil)) -> effect(EXF). from(Effect) -> {effect, [Effect]}. -spec none() -> effect(any()). none() -> {effect, []}. -spec batch(list(effect(EXJ))) -> effect(EXJ). batch(Effects) -> {effect, (gleam@list:fold( Effects, [], fun(B, _use1) -> {effect, A} = _use1, gleam@list:append(B, A) end ))}. -spec map(effect(EXN), fun((EXN) -> EXP)) -> effect(EXP). map(Effect, F) -> {effect, L} = Effect, {effect, gleam@list:map( L, fun(Effect@1) -> fun(Dispatch) -> Effect@1(fun(A) -> Dispatch(F(A)) end) end end )}.