Unsafe.hs (886B)
1 module Naturals.Finat.Unsafe ( 2 Finat (..), 3 finatMirror, 4 ) where 5 6 import GHC.Natural 7 import Unsafe.Coerce 8 9 import Naturals.IsFin 10 import Naturals.Nat 11 import Naturals.Natural 12 import Naturals.Peano 13 import Naturals.Snat.Unsafe 14 15 -- | Finite (@Peano@-indexed) prefixes of @Nat@. 16 newtype Finat (n :: Peano) = FinatUnsafe Nat deriving newtype (Show, Eq) 17 18 instance ToNat (Finat n) where 19 toNat (FinatUnsafe n) = n 20 21 instance ToNatural (Finat n) where 22 toNatural = wordToNatural . fromNat . toNat 23 24 instance IsFin Finat where 25 finZero = FinatUnsafe 0 26 27 finSucc = FinatUnsafe . succ . toNat 28 29 finPeel (FinatUnsafe 0) = unsafeCoerce FZeroOp 30 finPeel (FinatUnsafe n) = unsafeCoerce FSuccOp . FinatUnsafe . pred $ n 31 32 finWeaken (FinatUnsafe n) = FinatUnsafe n 33 34 finatMirror :: Snat n -> Finat n -> Finat n 35 finatMirror (SnatUnsafe n) (FinatUnsafe i) = FinatUnsafe (n - i - 1)