    -- | Module: Data.Either.Optics
    -- Description: 'Prism's for the 'Either' datatype.
    --
    -- This module defines 'Prism's for the constructors of the 'Either' datatype.
    module Data.Either.Optics
      ( _Left
      , _Right
      )
      where

    import Optics.Prism

    -- | A 'Prism' that matches on the 'Left' constructor of 'Either'.
    _Left :: Prism (Either a b) (Either c b) a c
    _Left :: forall a b c. Prism (Either a b) (Either c b) a c
    _Left =
      (c -> Either c b)
    -> (Either a b -> Either (Either c b) a)
    -> Prism (Either a b) (Either c b) a c
    forall b t s a. (b -> t) -> (s -> Either t a) -> Prism s t a b
    prism
        c -> Either c b
    forall a b. a -> Either a b
    Left
        (\ Either a b
    x ->
          case Either a b
    x of
            Left a
    y  -> a -> Either (Either c b) a
    forall a b. b -> Either a b
    Right a
    y
            Right b
    y -> Either c b -> Either (Either c b) a
    forall a b. a -> Either a b
    Left (b -> Either c b
    forall a b. b -> Either a b
    Right b
    y)
        )
    {-# INLINE _Left #-}

    -- | A 'Prism' that matches on the 'Right' constructor of 'Either'.
    _Right :: Prism (Either a b) (Either a c) b c
    _Right :: forall a b c. Prism (Either a b) (Either a c) b c
    _Right =
      (c -> Either a c)
    -> (Either a b -> Either (Either a c) b)
    -> Prism (Either a b) (Either a c) b c
    forall b t s a. (b -> t) -> (s -> Either t a) -> Prism s t a b
    prism
        c -> Either a c
    forall a b. b -> Either a b
    Right
        (\ Either a b
    x ->
          case Either a b
    x of
            Left a
    y  -> Either a c -> Either (Either a c) b
    forall a b. a -> Either a b
    Left (a -> Either a c
    forall a b. a -> Either a b
    Left a
    y)
            Right b
    y -> b -> Either (Either a c) b
    forall a b. b -> Either a b
    Right b
    y
        )
    {-# INLINE _Right #-}