module Data.Witness.Nat where
{
    import Prelude hiding (id,(.));
    import Data.Maybe;
    import Data.Type.Equality;
    import Data.Constraint(Dict(..));
    import Data.Nat;
    import Data.Witness.Representative;

    data NatType (t :: Nat) where
    {
        ZeroType :: NatType 'Zero;
        SuccType :: NatType t -> NatType ('Succ t);
    };

    instance TestEquality NatType where
    {
        testEquality ZeroType ZeroType = return Refl;
        testEquality (SuccType a) (SuccType b) = do
        {
            Refl <- testEquality a b;
            return Refl;
        };
        testEquality _ _ = Nothing;
    };

    instance Eq1 NatType where
    {
        equals1 a b = isJust (testEquality a b);
    };

    instance Representative NatType where
    {
        getRepWitness ZeroType = Dict;
        getRepWitness (SuccType n) = case getRepWitness n of
        {
            Dict -> Dict;
        };
    };

    instance Is NatType 'Zero where
    {
        representative = ZeroType;
    };

    instance (Is NatType n) => Is NatType ('Succ n) where
    {
        representative = SuccType representative;
    };
}