writer-cps-lens-0.1.0.0: src/Control/Monad/Trans/Writer/CPS/Lens.hs
{-# OPTIONS_GHC -fno-warn-orphans #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
module Control.Monad.Trans.Writer.CPS.Lens where
import Control.Lens
import Control.Lens.Internal.Zoom
import Control.Monad.Trans.Writer.CPS.Internal as Strict
import Control.Monad.Writer.CPS as Strict
import Data.Profunctor.Unsafe
-- | Unlike normal Wrapped instances, this doesn't simply peel off the newtype wrapper,
-- as that will expose the hidden CPS w state.
-- Based on code from Control.Lens.Wrapped
instance (Monoid w, Functor m, t ~ Strict.WriterT w' m' a') => Rewrapped (Strict.WriterT w m a) t
instance (Monoid w, Functor m) => Wrapped (Strict.WriterT w m a) where
type Unwrapped (Strict.WriterT w m a) = m (a, w)
_Wrapped' = iso Strict.runWriterT Strict.writerT
{-# INLINE _Wrapped' #-}
-- | The Zoomed instance uses the Strict.Internal constructor to avoid a @Monoid w@ constraint.
-- | Based on code from Control.Lens.Zoomed
type instance Zoomed (Strict.WriterT w m) = FocusingPlus w (Zoomed m)
instance Zoom m n s t => Zoom (Strict.WriterT w m) (Strict.WriterT w n) s t where
zoom l (Strict.WriterT m) = Strict.WriterT $ \w ->
zoom (\afb -> unfocusingPlus #. l (FocusingPlus #. afb)) (m w)
{-# INLINE zoom #-}