module Data.ForeignNat.Impl where data Nat = Zero | Suc Nat data Divides = Divides unpack :: Nat -> Integer unpack Zero = 0 unpack (Suc n) = 1 + (unpack n) pack :: Integer -> Nat pack 0 = Zero pack n = Suc $ pack (n-1) mul :: Nat -> Nat -> Nat n `mul` m = pack $ (unpack n) * (unpack m) divide :: Nat -> Nat -> Nat n `divide` m = pack $ (unpack n) `div` (unpack m) modulo :: Nat -> Nat -> Nat n `modulo` m = pack $ (unpack n) `mod` (unpack m) divides :: Nat -> Nat -> Bool n `divides` m = (unpack n) `mod` (unpack m) == 0 instance Show Nat where show = show . unpack