content: -- |
  -- 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
  