Effect CommunityEC
Effect Community14mo ago
23 replies
Aldwin

Handling Nested Contexts in Effect Without Monad Transformers

Effect doesn't have something akin to Monad Transformers, right? So if I want to bind in the context of an Option<Either<Ctx>> I have to double-bind like:

Option.Do.pipe(
  Option.bind('foo$', Function.constant(foo$$)),
  Option.bind('bar$', Function.constant(bar$$)),
  Option.bind('baz$', Function.constant(baz$$)),
  Option.map(({foo$, bar$, baz$}) => Either.Do.pipe(
    Either.bind('foo', Function.constant(foo$)),
    Either.bind('bar', Function.constant(bar$)),
    Either.bind('baz', Function.constant(baz$)),
    Either.map(({foo, bar, baz}) => foo + bar + baz)
  ))
)


Is there a more ergonomic way to do this? Like in (pseudo-)fp-ts:

const OptionEither = Option.Transform(Either);
OptionEither.Do.pipe(
  OptionEither.bind('foo', Function.constant(foo$$)),
  OptionEither.bind('bar', Function.constant(bar$$)),
  OptionEither.bind('baz', Function.constant(baz$$)),
  OptionEither.map(({foo, bar, baz}) => foo + bar + baz)
)
Was this page helpful?