Polysemy: Bundle

Polysemy comes with an useful effect to group other effects: Bundle.

It comes with a useful function:

sendBundle :: forall e r' r a. (Member e r', Member (Bundle r') r) => Sem (e ': r) a -> Sem r a

It can be used as follows:

act :: Members '[Bundle '[Trace]] r => Sem r ()
act = do
  sendBundle @Trace @'[Trace] $ trace "Hello"

The real benefit associated with Bundle are the interpreters.

runBundle injects Bundles' effects:

intrHidden :: Sem '[Bundle '[Trace], Embed IO] a -> IO a
intrHidden = runM . traceToStdout . runBundle

While subsumeBundle reuse interpreters:

intrExplicit :: Sem '[Bundle '[Trace], Trace, Embed IO] a -> IO a
intrExplicit = runM . traceToStdout . subsumeBundle

See the full the code here.