module Optics.Polysemy.Reader
  ( gview
  , gviews
  ) where

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

import Polysemy
import Polysemy.Reader
import Polysemy.ConstraintAbsorber.MonadReader

gview :: (ViewableOptic k r, Member (Reader s) effs) => Optic' k is s r -> Sem effs (ViewResult k r)
gview :: Optic' k is s r -> Sem effs (ViewResult k r)
gview Optic' k is s r
o = (MonadReader s (Sem effs) => Sem effs (ViewResult k r))
-> Sem effs (ViewResult k r)
forall i (r :: EffectRow) a.
Member (Reader i) r =>
(MonadReader i (Sem r) => Sem r a) -> Sem r a
absorbReader (Optic' k is s r -> Sem effs (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)
{-# INLINE gview #-}

gviews :: (ViewableOptic k r, Member (Reader s) effs) => Optic' k is s a -> (a -> r) -> Sem effs (ViewResult k r)
gviews :: Optic' k is s a -> (a -> r) -> Sem effs (ViewResult k r)
gviews Optic' k is s a
o a -> r
f = (MonadReader s (Sem effs) => Sem effs (ViewResult k r))
-> Sem effs (ViewResult k r)
forall i (r :: EffectRow) a.
Member (Reader i) r =>
(MonadReader i (Sem r) => Sem r a) -> Sem r a
absorbReader (Optic' k is s a -> (a -> r) -> Sem effs (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)
{-# INLINE gviews #-}