packages feed

either-n-0.1.0.0: src/Data/Lens/Injection/Injection6.hs

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# OPTIONS_GHC -Wall #-}

-- | The sixth injection of a sum type, as a prism. The sum-type dual of 'Control.Lens.Field6'.
module Data.Lens.Injection.Injection6 (
  Injection6 (..),
) where

import Control.Lens (Prism)
import Data.Lens.Injection.Generic (GInjection, injection)
import Data.Proxy (Proxy (..))
import GHC.Generics (Generic, Rep)

{- $setup
>>> :set -XDeriveGeneric -XMultiParamTypeClasses -XFlexibleInstances
>>> import Control.Lens((^?), (#))
>>> import GHC.Generics(Generic)
-}

{- | Access the sixth constructor of a sum type.

Where 'Control.Lens._6' is the sixth projection out of a product, '_I6' is the sixth
injection into a sum.

The default implementation is the prism to the sixth constructor of a
'Generic' type, @'injection' (Proxy :: Proxy 5)@.

>>> data T = C1 | C2 | C3 | C4 | C5 | C6 Int | C7 deriving (Show, Generic)
>>> instance Injection6 T T Int Int
>>> C6 1 ^? _I6
Just 1

>>> C7 ^? _I6
Nothing

>>> _I6 # 1 :: T
C6 1
-}
class Injection6 s t a b | s -> a, t -> b, s b -> t, t a -> s where
  _I6 :: Prism s t a b
  default _I6 :: (Generic s, Generic t, GInjection 5 (Rep s) (Rep t) a b) => Prism s t a b
  _I6 =
    injection (Proxy :: Proxy 5)
  {-# INLINE _I6 #-}