-- | 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 =
  prism
    Left
    (\ x ->
      case x of
        Left y  -> Right y
        Right y -> Left (Right y)
    )
{-# INLINE _Left #-}

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