single-tuple-0.1.3.0: src/Data/Tuple/Single.hs
{-# LANGUAGE CPP #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE Safe #-}
{-# LANGUAGE ViewPatterns #-}
{-# OPTIONS_HADDOCK show-extensions #-}
-- |
-- Copyright : Kazuki Okamoto
-- License : see LICENSE
-- Maintainer : kazuki.okamoto@kakkun61.com
-- Stability : experimental
-- Portability : GHC
--
-- A class for 1-tuples.
module Data.Tuple.Single
( Single (..)
, pattern Single
) where
import Data.Functor.Identity (Identity (Identity, runIdentity))
import Data.Tuple.Only (Only (Only, fromOnly))
#if MIN_VERSION_OneTuple(0,3,0)
#if !MIN_VERSION_base(4,15,0)
import qualified Data.Tuple.Solo as OneTuple
#endif
#else
import Data.Tuple.OneTuple (OneTuple (OneTuple), only)
#endif
#if MIN_VERSION_ghc_prim(0,10,0)
import GHC.Tuple (Solo (MkSolo))
#elif 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 Single a <- (unwrap -> a) where
Single a = wrap a
instance Single Identity where
wrap = Identity
unwrap = runIdentity
{-# COMPLETE Single :: Identity #-}
instance Single Only where
wrap = Only
unwrap = fromOnly
{-# COMPLETE Single :: Only #-}
#if MIN_VERSION_OneTuple(0,3,0)
#if !MIN_VERSION_base(4,15,0)
instance Single OneTuple.Solo where
wrap = OneTuple.Solo
unwrap = OneTuple.getSolo
{-# COMPLETE Single :: OneTuple.Solo #-}
#endif
#else
instance Single OneTuple where
wrap = OneTuple
unwrap = only
{-# COMPLETE Single :: OneTuple #-}
#endif
#if MIN_VERSION_ghc_prim(0,10,0)
instance Single Solo where
wrap = MkSolo
unwrap (MkSolo a) = a
{-# COMPLETE Single :: Solo #-}
#elif 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 = Unit
unwrap (Unit a) = a
{-# COMPLETE Single :: Unit #-}
#endif