module Optics.Polysemy.Writer
  ( glistening
  , glistenings
  ) where

import Optics
  ( Optic'
  , ViewResult
  , ViewableOptic
  )
import qualified Optics

import Polysemy
import Polysemy.Writer

glistening :: (ViewableOptic k r, Member (Writer s) effs) => Optic' k is s r -> Sem effs a -> Sem effs (a, ViewResult k r)
glistening :: Optic' k is s r -> Sem effs a -> Sem effs (a, ViewResult k r)
glistening Optic' k is s r
o Sem effs a
m = do
  (s
s, a
a) <- Sem effs a -> Sem effs (s, a)
forall o (r :: [Effect]) a.
MemberWithError (Writer o) r =>
Sem r a -> Sem r (o, a)
listen Sem effs a
m
  (a, ViewResult k r) -> Sem effs (a, ViewResult k r)
forall (m :: * -> *) a. Monad m => a -> m a
return (a
a, Optic' k is s r -> s -> ViewResult k r
forall k r s (m :: * -> *) (is :: IxList).
(ViewableOptic k r, MonadReader s m) =>
Optic' k is s r -> m (ViewResult k r)
Optics.gview Optic' k is s r
o s
s)
{-# INLINE glistening #-}

glistenings :: (ViewableOptic k r, Member (Writer s) effs) => Optic' k is s a -> (a -> r) -> Sem effs b -> Sem effs (b, ViewResult k r)
glistenings :: Optic' k is s a
-> (a -> r) -> Sem effs b -> Sem effs (b, ViewResult k r)
glistenings Optic' k is s a
o a -> r
f Sem effs b
m = do
  (s
s, b
b) <- Sem effs b -> Sem effs (s, b)
forall o (r :: [Effect]) a.
MemberWithError (Writer o) r =>
Sem r a -> Sem r (o, a)
listen Sem effs b
m
  (b, ViewResult k r) -> Sem effs (b, ViewResult k r)
forall (m :: * -> *) a. Monad m => a -> m a
return (b
b, Optic' k is s a -> (a -> r) -> s -> ViewResult k r
forall k r s (m :: * -> *) (is :: IxList) a.
(ViewableOptic k r, MonadReader s m) =>
Optic' k is s a -> (a -> r) -> m (ViewResult k r)
Optics.gviews Optic' k is s a
o a -> r
f s
s)
{-# INLINE glistenings #-}