module Data.Logic.Classes.Constants
    ( Constants(..)
    , asBool
    , ifElse
    , (⊨)
    , (⊭)
    ) where

-- |Some types in the Logic class heirarchy need to have True and
-- False elements.
class Constants p where
    fromBool :: Bool -> p
    true :: p
    true = fromBool True
    false :: p
    false = fromBool False

asBool :: (Eq p, Constants p) => p -> Maybe Bool 
asBool p | p == true = Just True
         | p == false = Just False
         | True = Nothing

ifElse :: a -> a -> Bool -> a
ifElse t _ True = t
ifElse _ f False = f

(⊨) :: Constants formula => formula
(⊨) = true
(⊭) :: Constants formula => formula
(⊭) = false