idris-0.9.6: lib/Prelude/Fin.idr
module Prelude.Fin
import Prelude.Nat
import Prelude.Either
data Fin : Nat -> Type where
fO : Fin (S k)
fS : Fin k -> Fin (S k)
instance Eq (Fin n) where
(==) = eq where
eq : Fin m -> Fin m -> Bool
eq fO fO = True
eq (fS k) (fS k') = eq k k'
eq _ _ = False
weaken : Fin n -> Fin (S n)
weaken fO = fO
weaken (fS k) = fS (weaken k)
strengthen : Fin (S n) -> Either (Fin (S n)) (Fin n)
strengthen {n = S k} fO = Right fO
strengthen {n = S k} (fS i) with (strengthen i)
strengthen (fS k) | Left x = Left (fS x)
strengthen (fS k) | Right x = Right (fS x)
strengthen f = Left f
last : Fin (S n)
last {n=O} = fO
last {n=S _} = fS last