-- | 'HandleReader' is like t'Bluefin.Reader.Reader', generalized to
-- work for arbitrary t'Bluefin.Compound.Handle's.  'localHandle'
-- locally overrides the value of a handle in a well-scoped way.  The
-- original handle will be restored when you exit the @localHandle@
-- block regardless of whether the exit was normal or via an
-- exception.
--
-- @HandleReader@ supports functionality similiar to @effectful@'s
-- [@interpose@](https://hackage.haskell.org/package/effectful-core/docs/Effectful-Dispatch-Dynamic.html#v:interpose)
-- and @polysemy@'s
-- [@intercept@](https://hackage.haskell.org/package/polysemy/docs/Polysemy.html#v:intercept),
-- that is, locally augmenting an effect with new behaviors.  If you
-- want to do the same in Bluefin you may want to start with
-- @Bluefin.FunctorCoroutine.'Bluefin.FunctorCoroutine.interpose`@.

module Bluefin.HandleReader
  ( -- * Handle
    HandleReader,

    -- * Handlers
    runHandleReader,

    -- * Effectful operations
    askHandle,
    asksHandle,
    localHandle,
  )
where

import Bluefin.Internal