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

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

  -- * Elimination
  -- |
  --
  -- A 'ReversedLens' is a 'Optics.Review.Review', so you can specialise types to obtain:
  --
  -- @
  -- 'Optics.Review.review' :: 'ReversedLens'' s a -> a -> s
  -- @
  --
  -- There is no corresponding optic kind for a backwards
  -- 'Optics.Setter.Setter', but a reversed 'Optics.Setter.set' is definable
  -- using 'Optics.Re.re':
  --
  -- @
  -- 'Optics.Setter.set' . 'Optics.Re.re' :: 'ReversedLens' s t a b -> s -> b -> a
  -- @

  -- * Computation
  -- |
  --
  -- @
  -- 'Optics.Review.review'   $ 'Optics.Re.re' ('Optics.Lens.lens' f g) ≡ f
  -- 'Optics.Setter.set' . 'Optics.Re.re' $ 'Optics.Re.re' ('Optics.Lens.lens' f g) ≡ g
  -- @

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

import Optics.Internal.Optic

-- | Type synonym for a type-modifying reversed lens.
type ReversedLens s t a b = Optic A_ReversedLens NoIx s t a b

-- | Type synonym for a type-preserving reversed lens.
type ReversedLens' t b = Optic' A_ReversedLens NoIx t b