-- |
-- Module: Optics.ReversedPrism
-- Description: A backwards 'Optics.Prism.Prism'.
--
-- A 'ReversedPrism' is a backwards 'Optics.Prism.Prism', i.e. a
-- @'ReversedPrism' s t a b@ is equivalent to a @'Optics.Prism.Prism' b a t
-- s@.  These are typically produced by calling 'Optics.Re.re' on a
-- 'Optics.Prism.Prism'.  They are distinguished from a 'Optics.Getter.Getter'
-- so that @'Optics.Re.re' . 'Optics.Re.re'@ on a 'Optics.Prism.Prism' returns a
-- 'Optics.Prism.Prism'.
--
module Optics.ReversedPrism
  ( -- * Formation
    ReversedPrism
  , ReversedPrism'

  -- * Introduction
  -- |
  --
  -- There is no canonical introduction form for 'ReversedPrism', but you can
  -- use 'Optics.Re.re' to construct one from a 'Optics.Prism.Prism':
  --
  -- @
  -- (\\ f g -> 'Optics.Re.re' ('Optics.Prism.prism' f g)) :: (s -> a) -> (b -> Either a t) -> 'ReversedPrism' s t a b
  -- @

  -- * Elimination
  -- |
  --
  -- A 'ReversedPrism' is a 'Optics.Getter.Getter', so you can specialise
  -- types to obtain:
  --
  -- @
  -- 'Optics.Getter.view' :: 'ReversedPrism'' s a -> s -> a
  -- @
  --
  -- There is no reversed 'Optics.AffineTraversal.matching' defined, but it is
  -- definable using 'Optics.Re.re':
  --
  -- @
  -- 'Optics.AffineTraversal.matching' . 'Optics.Re.re' :: 'ReversedPrism' s t a b -> b -> Either a t
  -- @

  -- * Computation
  -- |
  --
  -- @
  -- 'Optics.Getter.view'          $ 'Optics.Re.re' ('Optics.Prism.prism' f g) ≡ f
  -- 'Optics.AffineTraversal.matching' . 'Optics.Re.re' $ 'Optics.Re.re' ('Optics.Prism.prism' f g) ≡ g
  -- @

  -- * Subtyping
  , A_ReversedPrism
  -- | <<diagrams/ReversedPrism.png ReversedPrism in the optics hierarchy>>
  ) where

import Optics.Internal.Optic

-- | Type synonym for a type-modifying reversed prism.
type ReversedPrism s t a b = Optic A_ReversedPrism NoIx s t a b

-- | Type synonym for a type-preserving reversed prism.
type ReversedPrism' s a = Optic' A_ReversedPrism NoIx s a