{-# LANGUAGE CPP, MagicHash, PatternSynonyms, ViewPatterns, DefaultSignatures #-}
{-# LANGUAGE Trustworthy, ConstraintKinds #-}
#if __GLASGOW_HASKELL__ >= 806
{-# LANGUAGE QuantifiedConstraints, RankNTypes #-}
#endif
module SDP.Nullable
(
Nullable (..), Nullable1, Nullable2,
#if __GLASGOW_HASKELL__ >= 806
Nullable', Nullable'',
#endif
pattern NULL, pattern Z
)
where
import Foreign.Ptr
import GHC.ForeignPtr
import GHC.Stable
import GHC.Base
import GHC.Exts
import Control.Exception.SDP
default ()
class Nullable e
where
lzero :: e
lzero = e
forall a. Monoid a => a
mempty
default lzero :: (Monoid e) => e
isNull :: e -> Bool
isNull = (e -> e -> Bool
forall a. Eq a => a -> a -> Bool
== e
forall e. Nullable e => e
lzero)
default isNull :: (Eq e) => e -> Bool
pattern NULL :: (Nullable e) => e
pattern $bNULL :: e
$mNULL :: forall r e. Nullable e => e -> (Void# -> r) -> (Void# -> r) -> r
NULL <- (isNull -> True) where NULL = e
forall e. Nullable e => e
lzero
pattern Z :: (Nullable e) => e
pattern $bZ :: e
$mZ :: forall r e. Nullable e => e -> (Void# -> r) -> (Void# -> r) -> r
Z = NULL
type Nullable1 rep e = Nullable (rep e)
type Nullable2 rep i e = Nullable (rep i e)
#if __GLASGOW_HASKELL__ >= 806
type Nullable' rep = forall e . Nullable (rep e)
type Nullable'' rep = forall i e . Nullable (rep i e)
#endif
{-# COMPLETE Z, Just #-}
{-# COMPLETE NULL, Just #-}
instance Nullable (Maybe e)
where
isNull :: Maybe e -> Bool
isNull = \ Maybe e
mx -> case Maybe e
mx of {Maybe e
Nothing -> Bool
True; Maybe e
_ -> Bool
False}
lzero :: Maybe e
lzero = Maybe e
forall e. Maybe e
Nothing
{-# COMPLETE Z, (:) #-}
{-# COMPLETE NULL, (:) #-}
instance Nullable [e] where isNull :: [e] -> Bool
isNull = [e] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null
instance Nullable (Ptr e) where lzero :: Ptr e
lzero = Ptr e
forall e. Ptr e
nullPtr
instance Nullable (ForeignPtr e)
where
#if MIN_VERSION_base(4,15,0)
lzero = ForeignPtr nullAddr# FinalPtr
#else
lzero :: ForeignPtr e
lzero =
let err :: a
err = UnreachableException -> a
forall a e. Exception e => e -> a
throw (UnreachableException -> a) -> UnreachableException -> a
forall a b. (a -> b) -> a -> b
$ String -> UnreachableException
UnreachableException String
"in SDP.Nullable.lzero :: ForeignPtr e"
in Addr# -> ForeignPtrContents -> ForeignPtr e
forall a. Addr# -> ForeignPtrContents -> ForeignPtr a
ForeignPtr Addr#
nullAddr# ForeignPtrContents
forall a. a
err
#endif
isNull :: ForeignPtr e -> Bool
isNull (ForeignPtr Addr#
addr# ForeignPtrContents
_) = Addr# -> Ptr Any
forall a. Addr# -> Ptr a
Ptr Addr#
addr# Ptr Any -> Ptr Any -> Bool
forall a. Eq a => a -> a -> Bool
== Ptr Any
forall e. Ptr e
nullPtr
instance Nullable (StablePtr e) where lzero :: StablePtr e
lzero = StablePtr# e -> StablePtr e
forall a. StablePtr# a -> StablePtr a
StablePtr (Int# -> StablePtr# e
unsafeCoerce# Int#
0#)
instance Nullable (FunPtr e) where lzero :: FunPtr e
lzero = FunPtr e
forall e. FunPtr e
nullFunPtr