-- | -- 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 -- | <> ) 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