{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE RebindableSyntax #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
-- | Rebinable syntax helper.
module TypeLevel.Bool where
import Data.Type.Equality
import TypeLevel.Singletons
import Prelude
-- | For use with @-XRebindableSyntax@. This function can be used to
-- make Haskell look reasonably dependent:
--
-- @
-- depHask :: 'The' 'Bool' x -> 'IfThenElse' x 'Int' 'String'
-- depHask cond =
-- if cond
-- then \\'Refl' -> 1
-- else \\'Refl' -> "abc"
-- @
ifThenElse :: The Bool c -> (c :~: 'True -> a) -> (c :~: 'False -> a) -> a
ifThenElse Truey t _ = t Refl
ifThenElse Falsy _ f = f Refl
-- | Type-level if then else.
type family IfThenElse (c :: Bool) (true :: k) (false :: k) :: k
where
IfThenElse 'True true false = true
IfThenElse 'False true false = false