fixfile-0.6.0.0: src/Data/FixFile/Null.hs
{-# LANGUAGE FlexibleInstances, FlexibleContexts #-}
module Data.FixFile.Null (
Null1(..)
,Null(..)
) where
import Data.FixFile.Fixed
{-|
'Null' is a typeclass for representing data that can be 'empty' as well as
the 'null' predicate that can determine if a piece of data is 'empty'.
-}
class Null f where
empty :: f
null :: f -> Bool
{-|
'Null1' is for expressing null types of kind @(* -> *)@.
-}
class Null1 f where
empty1 :: f a
null1 :: f a -> Bool
instance Null1 f => Null (f a) where
empty = empty1
null = null1
instance Null1 Maybe where
empty1 = Nothing
null1 Nothing = True
null1 _ = False
instance Null1 [] where
empty1 = []
null1 [] = True
null1 _ = False
instance (Fixed g, Null1 f) => Null (g f) where
empty = inf empty1
null = null1 . outf