How is this not a monad? It might be trying really hard not to reify the core concept of a monad, but it seems to me like it ends up being essentially a complicated monad.
The main difference is that SideEffect isn’t a compositional context — there’s no bind/flatMap, and composition intentionally stops once it appears.
It’s meant as an explicit early-exit signal in pipe-first code, not a general computation container.
fp-pack is also intentionally scoped for everyday frontend developers.
It tries to borrow function composition and declarative structure without requiring familiarity with full FP abstractions like monads or effect systems.
One more practical point is that a full monad doesn’t fit very naturally into a pipe-first interface.
Once you commit to a real monad, you need map/flatMap, lifting, unwrapping, and rules about staying inside the context across the whole pipeline.
At that point, the pipe abstraction stops being the primary mental model — the monad does.
SideEffect deliberately avoids that.
It keeps the pipe interface intact and only adds a single, explicit signal: “stop here”.
That’s why it’s less powerful than a monad, but also much simpler to integrate into existing pipe-based code.