content: {-# LANGUAGE
      CPP,
      DataKinds,
      PolyKinds,
      TypeFamilies,
      TypeOperators,
      UndecidableInstances #-}
  
  #if __GLASGOW_HASKELL__ >= 806
  {-# LANGUAGE NoStarIsType #-}
  #endif
  
  -- | Natural numbers.
  --
  -- Note that the operators from this module conflict with "GHC.TypeLits" and
  -- "GHC.TypeNats".
  module Fcf.Data.Nat
    ( -- * Reexported type
      -- | From "GHC.TypeNats".
  
      Nat
  
      -- * Operations
  
    , type (+)
    , type (-)
    , type (Fcf.Data.Nat.*)
    , type (^)
  
      -- * Comparisons
      -- | Note that these conflict with "Fcf.Class.Ord".
    , type (<=)
    , type (>=)
    , type (<)
    , type (>)
    ) where
  
  import GHC.TypeLits (Nat)
  import qualified GHC.TypeLits as TL
  
  import Fcf.Core
  import Fcf.Combinators
  import Fcf.Data.Bool (Not)
  
  data (+) :: Nat -> Nat -> Exp Nat
  type instance Eval ((+) a b) = a TL.+ b
  
  data (-) :: Nat -> Nat -> Exp Nat
  type instance Eval ((-) a b) = a TL.- b
  
  data (*) :: Nat -> Nat -> Exp Nat
  type instance Eval ((Fcf.Data.Nat.*) a b) = a TL.* b
  
  data (^) :: Nat -> Nat -> Exp Nat
  type instance Eval ((^) a b) = a TL.^ b
  
  data (<=) :: Nat -> Nat -> Exp Bool
  type instance Eval ((<=) a b) = a TL.<=? b
  
  data (>=) :: Nat -> Nat -> Exp Bool
  type instance Eval ((>=) a b) = b TL.<=? a
  
  data (<) :: Nat -> Nat -> Exp Bool
  type instance Eval ((<) a b) = Eval (Not =<< (a >= b))
  
  data (>) :: Nat -> Nat -> Exp Bool
  type instance Eval ((>) a b) = Eval (Not =<< (a <= b))
  
  