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 o = absorbReader (Optics.gview o)
{-# INLINE gview #-}

gviews :: (ViewableOptic k r, Member (Reader s) effs) => Optic' k is s a -> (a -> r) -> Sem effs (ViewResult k r)
gviews o f = absorbReader (Optics.gviews o f)
{-# INLINE gviews #-}