optics-core-0.2: src/Optics/Review.hs
-- |
-- Module: Optics.Review
-- Description: A backwards 'Optics.Getter.Getter', i.e. a function.
--
-- A 'Review' is a backwards 'Optics.Getter.Getter', i.e. a
-- @'Review' T B@ is just a function @B -> T@.
--
module Optics.Review
(
-- * Formation
Review
-- * Introduction
, unto
-- * Elimination
, review
-- * Computation
-- |
--
-- @
-- 'review' ('unto' f) = f
-- @
-- * Subtyping
, A_Review
-- | <<diagrams/Review.png Review in the optics hierarchy>>
)
where
import Data.Profunctor.Indexed
import Optics.Internal.Bi
import Optics.Internal.Optic
-- | Type synonym for a review.
type Review t b = Optic' A_Review NoIx t b
-- | Retrieve the value targeted by a 'Review'.
--
-- >>> review _Left "hi"
-- Left "hi"
review :: Is k A_Review => Optic' k is t b -> b -> t
review o = unTagged #. getOptic (castOptic @A_Review o) .# Tagged
{-# INLINE review #-}
-- | An analogue of 'Optics.Getter.to' for reviews.
unto :: (b -> t) -> Review t b
unto f = Optic (lphantom . rmap f)
{-# INLINE unto #-}
-- $setup
-- >>> import Optics.Core