Idris2/tests/idris2/basic/basic018/Fin.idr
2023-09-07 14:57:22 +01:00

35 lines
835 B
Idris

data Fin : Nat -> Type where
FZ : Fin (S k)
FS : Fin k -> Fin (S k)
natToFin : Nat -> (n : Nat) -> Maybe (Fin n)
natToFin Z (S j) = Just FZ
natToFin (S k) (S j)
= case natToFin k j of
Just k' => Just (FS k')
Nothing => Nothing
natToFin _ _ = Nothing
integerToFin : Integer -> (n : Nat) -> Maybe (Fin n)
integerToFin x Z = Nothing
integerToFin x n = if x >= 0 then natToFin (fromInteger x) n else Nothing
data IsJust : Maybe a -> Type where
ItIsJust : IsJust (Just x)
-- Testing that %allow_overloads lets this one through!
partial
fromInteger : {k : Nat} ->
(n : Integer) ->
{auto prf : IsJust (integerToFin n k)} ->
Fin k
fromInteger {k} n {prf}
= case integerToFin n k of
Just val => val
foo : Fin 5
foo = 3
bar : Fin 5
bar = 8