{-# LANGUAGE CPP #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE Safe #-}
{-# LANGUAGE ViewPatterns #-}
{-# OPTIONS_HADDOCK show-extensions #-}
module Data.Tuple.Single
( Single (..)
, pattern Single
) where
import Data.Functor.Identity (Identity (Identity, runIdentity))
import Data.Tuple.OneTuple (OneTuple (OneTuple), only)
import Data.Tuple.Only (Only (Only, fromOnly))
#if MIN_VERSION_ghc_prim(0,7,0)
import GHC.Tuple (Solo (Solo))
#else
import GHC.Tuple (Unit (Unit))
#endif
class Single t where
wrap :: a -> t a
unwrap :: t a -> a
pattern Single :: Single t => a -> t a
pattern $bSingle :: a -> t a
$mSingle :: forall r (t :: * -> *) a.
Single t =>
t a -> (a -> r) -> (Void# -> r) -> r
Single a <- (unwrap -> a) where
Single a
a = a -> t a
forall (t :: * -> *) a. Single t => a -> t a
wrap a
a
instance Single Identity where
wrap :: a -> Identity a
wrap = a -> Identity a
forall a. a -> Identity a
Identity
unwrap :: Identity a -> a
unwrap = Identity a -> a
forall a. Identity a -> a
runIdentity
{-# COMPLETE Single :: Identity #-}
instance Single Only where
wrap :: a -> Only a
wrap = a -> Only a
forall a. a -> Only a
Only
unwrap :: Only a -> a
unwrap = Only a -> a
forall a. Only a -> a
fromOnly
{-# COMPLETE Single :: Only #-}
instance Single OneTuple where
wrap :: a -> OneTuple a
wrap = a -> OneTuple a
forall a. a -> OneTuple a
OneTuple
unwrap :: OneTuple a -> a
unwrap = OneTuple a -> a
forall a. OneTuple a -> a
only
{-# COMPLETE Single :: OneTuple #-}
#if MIN_VERSION_ghc_prim(0,7,0)
instance Single Solo where
wrap = Solo
unwrap (Solo a) = a
{-# COMPLETE Single :: Solo #-}
#else
instance Single Unit where
wrap :: a -> Unit a
wrap = a -> Unit a
forall a. a -> Unit a
Unit
unwrap :: Unit a -> a
unwrap (Unit a
a) = a
a
{-# COMPLETE Single :: Unit #-}
#endif