{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DataKinds       #-}
{-# LANGUAGE PolyKinds       #-}
{-# LANGUAGE Safe            #-}
{-# LANGUAGE TypeFamilies    #-}
{-# LANGUAGE TypeOperators   #-}

module Data.TypeNums.Equality where

import           Data.Type.Bool     (Not)
import qualified Data.Type.Equality as DTE

infix 4 ==?, /=?, ==, /=

-- | Boolean type-level equals.  Useful for e.g.
--   @'Data.Type.Bool.If' (x ==? 0)@
type (a :: k) ==? (b :: k) = (DTE.==) a b

-- | Boolean type-level not-equals.
type (a :: k) /=? (b :: k) = Not ((DTE.==) a b)

-- | Equality constraint, used as e.g. @(x == 3) => _@
type (a :: k) == (b :: k) = ((DTE.==) a b) ~ 'True

-- | Not-equal constraint
type (a :: k) /= (b :: k) = ((DTE.==) a b) ~ 'False