{-# LANGUAGE MultiParamTypeClasses , FunctionalDependencies , FlexibleInstances, EmptyDataDecls , DataKinds , KindSignatures, TypeFamilies #-} module Data.Shapely.Bool where -- Probably keep private for now, as with Data.Shapely.Category -- Again, these borrowed from Oleg's HList work type family And (a :: Bool) (b :: Bool) :: Bool type instance And True b = b type instance And b True = b type instance And False b = False -- N.B. coincident overlap type instance And b False = False -- N.B. coincident overlap type family Or (a :: Bool) (b :: Bool) :: Bool type instance Or False b = b type instance Or b False = b type instance Or True b = True -- N.B. coincident overlap type instance Or b True = True -- N.B. coincident overlap type family Not (a :: Bool) :: Bool type instance Not True = False type instance Not False = True