{-# LANGUAGE DataKinds #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE ScopedTypeVariables #-}

module Data.Type.Nat (
    Nat (..), KnownNat (..)
) where

import Data.Proxy (Proxy (..))

data Nat = Zero | Succ Nat

class KnownNat (n :: Nat) where
    natVal :: proxy n -> Integer

instance KnownNat 'Zero where
    natVal _ = 0

instance KnownNat n => KnownNat ('Succ n) where
    natVal _ = 1 + natVal (Proxy :: Proxy n)