{-# LANGUAGE MultiParamTypeClasses
, FunctionalDependencies
, FlexibleInstances
, KindSignatures
, TypeFamilies #-}
{-
Bool.hs
Copyright 2008 Matthew Sackman
This file is part of Session Types for Haskell.
Session Types for Haskell is free software: you can redistribute it
and/or modify it under the terms of the GNU General Public License
as published by the Free Software Foundation, either version 3 of
the License, or (at your option) any later version.
Session Types for Haskell is distributed in the hope that it will
be useful, but WITHOUT ANY WARRANTY; without even the implied
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Session Types for Haskell.
If not, see .
-}
module Control.Concurrent.Session.Base.Bool where
infixr 1 :$
infixr 9 :.
type (:$) (a :: * -> *) b = a b
type (:.) (a :: (* -> *)) (b :: (* -> *)) (c :: *) = a (b c)
data True = TT deriving (Show)
data False = FF deriving (Show)
class And x y z | x y -> z where
tyAnd :: x -> y -> z
instance And True True True where
tyAnd TT TT = TT
instance And True False False where
tyAnd TT FF = FF
instance And False y False where
tyAnd FF _ = FF
class Or x y z | x y -> z where
tyOr :: x -> y -> z
instance Or True y True where
tyOr TT _ = TT
instance Or False True True where
tyOr FF TT = TT
instance Or False False False where
tyOr FF FF = FF
class If c x y z | c x y -> z where
tyIf :: c -> x -> y -> z
instance If True x y x where
tyIf TT x _ = x
instance If False x y y where
tyIf FF _ y = y
class Not x y | x -> y where
type NotT x
tyNot :: x -> y
instance Not True False where
type NotT True = False
tyNot TT = FF
instance Not False True where
type NotT False = True
tyNot FF = TT