optics-core-0.1: src/Optics/ReversedPrism.hs
-- |
-- 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