{-# LANGUAGE PackageImports #-}
module Data.Fin(
Nat(..), SNat(..),
Fin(..),
toNat, fromNat, toInteger,
mirror,
absurd,
universe,
f0,f1,f2,f3,
invert,
shiftN,
shift1,
weakenFin,
weakenFinRight,
weaken1Fin,
weaken1FinRight,
strengthen1Fin,
strengthenRecFin
) where
import Data.Nat
import Data.SNat
import "fin" Data.Fin hiding (cata)
import Data.Proxy (Proxy (..))
import Unsafe.Coerce (unsafeCoerce)
instance ToInt (Fin n) where
toInt :: Fin n -> Int
toInt :: Fin n -> Int
toInt Fin n
FZ = Int
0
toInt (FS Fin n1
x) = Int
1 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Fin n1 -> Int
forall a. ToInt a => a -> Int
toInt Fin n1
x
invert :: forall n. (SNatI n) => Fin n -> Fin n
invert :: forall (n :: Nat). SNatI n => Fin n -> Fin n
invert Fin n
f = case forall (n :: Nat). SNatI n => SNat n
snat @n of
SNat n
SZ -> case Fin n
f of {}
SNat n
SS -> Fin n
forall a. Bounded a => a
maxBound Fin n -> Fin n -> Fin n
forall a. Num a => a -> a -> a
- Fin n
f
shiftN :: forall n m. SNat n -> Fin m -> Fin (n + m)
shiftN :: forall (n :: Nat) (m :: Nat). SNat n -> Fin m -> Fin (n + m)
shiftN SNat n
p Fin m
f = SNat n -> (SNatI n => Fin (n + m)) -> Fin (n + m)
forall (n :: Nat) r. SNat n -> (SNatI n => r) -> r
withSNat SNat n
p ((SNatI n => Fin (n + m)) -> Fin (n + m))
-> (SNatI n => Fin (n + m)) -> Fin (n + m)
forall a b. (a -> b) -> a -> b
$ Proxy n -> Fin m -> Fin (Plus n m)
forall (n :: Nat) (m :: Nat).
SNatI n =>
Proxy n -> Fin m -> Fin (Plus n m)
weakenRight (Proxy n
forall {k} (t :: k). Proxy t
Proxy :: Proxy n) Fin m
f
shift1 :: Fin m -> Fin (S m)
shift1 :: forall (m :: Nat). Fin m -> Fin ('S m)
shift1 = SNat N1 -> Fin m -> Fin (N1 + m)
forall (n :: Nat) (m :: Nat). SNat n -> Fin m -> Fin (n + m)
shiftN SNat N1
s1
weakenFin :: proxy m -> Fin n -> Fin (m + n)
weakenFin :: forall (proxy :: Nat -> *) (m :: Nat) (n :: Nat).
proxy m -> Fin n -> Fin (m + n)
weakenFin proxy m
_ Fin n
f = Fin n -> Fin (Plus m n)
forall a b. a -> b
unsafeCoerce Fin n
f
weaken1Fin :: Fin n -> Fin (S n)
weaken1Fin :: forall (m :: Nat). Fin m -> Fin ('S m)
weaken1Fin = SNat N1 -> Fin n -> Fin (N1 + n)
forall (proxy :: Nat -> *) (m :: Nat) (n :: Nat).
proxy m -> Fin n -> Fin (m + n)
weakenFin SNat N1
s1
weakenFinRight :: proxy m -> Fin n -> Fin (n + m)
weakenFinRight :: forall (proxy :: Nat -> *) (m :: Nat) (n :: Nat).
proxy m -> Fin n -> Fin (n + m)
weakenFinRight proxy m
m Fin n
f = Fin n -> Fin (Plus n m)
forall a b. a -> b
unsafeCoerce Fin n
f
weaken1FinRight :: Fin n -> Fin (n + N1)
weaken1FinRight :: forall (n :: Nat). Fin n -> Fin (n + N1)
weaken1FinRight = SNat N1 -> Fin n -> Fin (n + N1)
forall (proxy :: Nat -> *) (m :: Nat) (n :: Nat).
proxy m -> Fin n -> Fin (n + m)
weakenFinRight SNat N1
s1
f0 :: Fin (S n)
f0 :: forall (n :: Nat). Fin ('S n)
f0 = Fin ('S n)
forall (n :: Nat). Fin ('S n)
FZ
f1 :: Fin (S (S n))
f1 :: forall (n :: Nat). Fin ('S ('S n))
f1 = Fin ('S n) -> Fin ('S ('S n))
forall (m :: Nat). Fin m -> Fin ('S m)
FS Fin ('S n)
forall (n :: Nat). Fin ('S n)
f0
f2 :: Fin (S (S (S n)))
f2 :: forall (n :: Nat). Fin ('S ('S ('S n)))
f2 = Fin ('S ('S n)) -> Fin ('S ('S ('S n)))
forall (m :: Nat). Fin m -> Fin ('S m)
FS Fin ('S ('S n))
forall (n :: Nat). Fin ('S ('S n))
f1
f3 :: Fin (S (S (S (S n))))
f3 :: forall (n :: Nat). Fin ('S ('S ('S ('S n))))
f3 = Fin ('S ('S ('S n))) -> Fin ('S ('S ('S ('S n))))
forall (m :: Nat). Fin m -> Fin ('S m)
FS Fin ('S ('S ('S n)))
forall (n :: Nat). Fin ('S ('S ('S n)))
f2
strengthen1Fin :: forall n. SNatI n => Fin (S n) -> Maybe (Fin n)
strengthen1Fin :: forall (n :: Nat). SNatI n => Fin ('S n) -> Maybe (Fin n)
strengthen1Fin = SNat 'Z
-> SNat N1 -> Any n -> Fin ('Z + (N1 + n)) -> Maybe (Fin ('Z + n))
forall (k :: Nat) (m :: Nat) (proxy :: Nat -> *) (n :: Nat).
SNat k
-> SNat m -> proxy n -> Fin (k + (m + n)) -> Maybe (Fin (k + n))
strengthenRecFin SNat 'Z
s0 SNat N1
s1 Any n
forall a. HasCallStack => a
undefined
strengthenRecFin ::
SNat k -> SNat m -> proxy n -> Fin (k + (m + n)) -> Maybe (Fin (k + n))
strengthenRecFin :: forall (k :: Nat) (m :: Nat) (proxy :: Nat -> *) (n :: Nat).
SNat k
-> SNat m -> proxy n -> Fin (k + (m + n)) -> Maybe (Fin (k + n))
strengthenRecFin SNat k
SZ SNat m
SZ proxy n
n Fin (k + (m + n))
x = Fin n -> Maybe (Fin n)
forall a. a -> Maybe a
Just Fin n
Fin (k + (m + n))
x
strengthenRecFin SNat k
SZ (SNat m -> SNat_ m
forall (n :: Nat). SNat n -> SNat_ n
snat_ -> SS_ SNat n1
m) proxy n
n Fin (k + (m + n))
FZ = Maybe (Fin n)
Maybe (Fin (k + n))
forall a. Maybe a
Nothing
strengthenRecFin SNat k
SZ (SNat m -> SNat_ m
forall (n :: Nat). SNat n -> SNat_ n
snat_ -> SS_ SNat n1
m) proxy n
n (FS Fin n1
x) =
SNat 'Z
-> SNat n1
-> proxy n
-> Fin ('Z + (n1 + n))
-> Maybe (Fin ('Z + n))
forall (k :: Nat) (m :: Nat) (proxy :: Nat -> *) (n :: Nat).
SNat k
-> SNat m -> proxy n -> Fin (k + (m + n)) -> Maybe (Fin (k + n))
strengthenRecFin SNat 'Z
SZ SNat n1
m proxy n
n Fin n1
Fin ('Z + (n1 + n))
x
strengthenRecFin (SNat k -> SNat_ k
forall (n :: Nat). SNat n -> SNat_ n
snat_ -> SS_ SNat n1
k) SNat m
m proxy n
n Fin (k + (m + n))
FZ = Fin ('S (Plus n1 n)) -> Maybe (Fin ('S (Plus n1 n)))
forall a. a -> Maybe a
Just Fin ('S (Plus n1 n))
forall (n :: Nat). Fin ('S n)
FZ
strengthenRecFin (SNat k -> SNat_ k
forall (n :: Nat). SNat n -> SNat_ n
snat_ -> SS_ SNat n1
k) SNat m
m proxy n
n (FS Fin n1
x) =
Fin (Plus n1 n) -> Fin ('S (Plus n1 n))
forall (m :: Nat). Fin m -> Fin ('S m)
FS (Fin (Plus n1 n) -> Fin ('S (Plus n1 n)))
-> Maybe (Fin (Plus n1 n)) -> Maybe (Fin ('S (Plus n1 n)))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> SNat n1
-> SNat m -> proxy n -> Fin (n1 + (m + n)) -> Maybe (Fin (n1 + n))
forall (k :: Nat) (m :: Nat) (proxy :: Nat -> *) (n :: Nat).
SNat k
-> SNat m -> proxy n -> Fin (k + (m + n)) -> Maybe (Fin (k + n))
strengthenRecFin SNat n1
k SNat m
m proxy n
n Fin n1
Fin (n1 + (m + n))
x