-- | -- Module: Data.Maybe.Optics -- Description: 'Prism's for the 'Maybe' datatype. -- -- This module defines 'Prism's for the constructors of the 'Maybe' datatype. module Data.Maybe.Optics ( _Nothing , _Just , (%?) ) where import Optics.Internal.Optic import Optics.Prism -- | A 'Prism' that matches on the 'Nothing' constructor of 'Maybe'. _Nothing :: Prism' (Maybe a) () _Nothing = prism (\ () -> Nothing) (\ x -> case x of Nothing -> Right () Just y -> Left (Just y) ) {-# INLINE _Nothing #-} -- | A 'Prism' that matches on the 'Just' constructor of 'Maybe'. _Just :: Prism (Maybe a) (Maybe b) a b _Just = prism Just (\ x -> case x of Nothing -> Left Nothing Just y -> Right y ) {-# INLINE _Just #-} -- | Shortcut for @'%' '_Just' '%'@. -- -- Useful for composing lenses of 'Maybe' type. -- -- @since 0.4.1 infixl 9 %? (%?) :: (AppendIndices is js ks, JoinKinds k A_Prism k', JoinKinds k' l m) => Optic k is s t (Maybe u) (Maybe v) -> Optic l js u v a b -> Optic m ks s t a b o1 %? o2 = o1 % _Just % o2 {-# INLINE (%?) #-}