base-4.7.0.0: Data/Type/Bool.hs
{-# LANGUAGE TypeFamilies, TypeOperators, DataKinds, NoImplicitPrelude,
PolyKinds #-}
-----------------------------------------------------------------------------
-- |
-- Module : Data.Type.Bool
-- License : BSD-style (see the LICENSE file in the distribution)
--
-- Maintainer : libraries@haskell.org
-- Stability : experimental
-- Portability : not portable
--
-- Basic operations on type-level Booleans.
--
-- /Since: 4.7.0.0/
-----------------------------------------------------------------------------
module Data.Type.Bool (
If, type (&&), type (||), Not
) where
import Data.Bool
-- This needs to be in base because (&&) is used in Data.Type.Equality.
-- The other functions do not need to be in base, but seemed to be appropriate
-- here.
-- | Type-level "If". @If True a b@ ==> @a@; @If False a b@ ==> @b@
type family If cond tru fls where
If True tru fls = tru
If False tru fls = fls
-- | Type-level "and"
type family a && b where
False && a = False
True && a = a
a && False = False
a && True = a
a && a = a
infixr 3 &&
-- | Type-level "or"
type family a || b where
False || a = a
True || a = True
a || False = a
a || True = True
a || a = a
infixr 2 ||
-- | Type-level "not"
type family Not a where
Not False = True
Not True = False