35 lines
829 B
Agda
35 lines
829 B
Agda
module Data.Fin
|
|
import Prelude
|
|
|
|
-- TODO - handle erased params in Nat transform.
|
|
-- TODO - double check we erase params to type constructors
|
|
data Fin : Nat → U where
|
|
FZ : ∀ k. Fin (S k)
|
|
FS : ∀ k. Fin k → Fin (S k)
|
|
|
|
allFins : (n : Nat) → List (Fin n)
|
|
allFins Z = Nil
|
|
allFins (S k) = FZ :: map FS (allFins k)
|
|
|
|
-- TODO maybe teach compiler to recognize and make magic Nat Eq fast?
|
|
instance ∀ n. Eq (Fin n) where
|
|
FZ == FZ = True
|
|
FS l == FS n = l == n
|
|
_ == _ = False
|
|
|
|
-- TODO - recognize identity functions
|
|
weaken : ∀ k. Fin k → Fin (S k)
|
|
weaken FZ = FZ
|
|
weaken (FS k) = FS $ weaken k
|
|
|
|
instance ∀ n. Cast (Fin n) Nat where
|
|
cast FZ = Z
|
|
cast (FS x) = S (cast x)
|
|
|
|
instance ∀ k. Show (Fin k) where
|
|
show x = show {Nat} $ cast x
|
|
|
|
lastFin : {n : _} -> Fin (S n)
|
|
lastFin {Z} = FZ
|
|
lastFin {S _} = FS lastFin
|