diff --git a/src/Data/OpenApi/Declare.hs b/src/Data/OpenApi/Declare.hs index 559009a2..3cb2abcc 100644 --- a/src/Data/OpenApi/Declare.hs +++ b/src/Data/OpenApi/Declare.hs @@ -29,6 +29,8 @@ import Control.Monad.Trans.RWS.Strict as Strict import Control.Monad.Trans.Writer.Lazy as Lazy import Control.Monad.Trans.Writer.Strict as Strict import Data.Functor.Identity +import Data.Functor.Compose +import Data.Tuple (swap) -- | A declare monad transformer parametrized by: -- @@ -115,6 +117,15 @@ execDeclareT (DeclareT f) d = fst <$> f d undeclareT :: (Monad m, Monoid d) => DeclareT d m a -> m a undeclareT = flip evalDeclareT mempty +-- | Lift a declaration-producing computation for a subpart into a +-- declaration-producing computation for the whole. +hoistDeclareT :: Functor m => Lens' d d' -> DeclareT d' m a -> DeclareT d m a +hoistDeclareT l = DeclareT . unconvert . l . convert . runDeclareT + where + convert f = Compose . fmap swap . f + unconvert f = fmap swap . getCompose . f + + -- | A declare monad parametrized by @d@ — the output to accumulate (declarations). -- -- This monad is similar to both state and writer monads.