9 | interface Finite a where
10 | constructor MkFinite
13 | public export %inline
14 | valuesOf : (0 a : Type) -> Finite a => List a
18 | Finite () where values = [()]
21 | Finite Void where values = []
24 | Finite Bool where values = [False,True]
27 | Finite Ordering where values = [LT,EQ,GT]
30 | Finite a => Finite (Maybe a) where values = Nothing :: map Just values
33 | Finite a => Finite b => Finite (Either a b) where
34 | values = map Left values ++ map Right values
37 | Finite a => Finite b => Finite (a,b) where
38 | values = [| MkPair values values |]
41 | {n : _} -> Finite a => Finite (Vect n a) where
42 | values {n = 0} = [[]]
43 | values {n = S k} = [| values :: values |]
45 | weaken : List (Fin k) -> List (Fin $
S k)
47 | weaken (x :: xs) = weaken x :: weaken xs
49 | fins : {n : _} -> List (Fin n)
51 | fins {n = S k} = last :: weaken (fins {n = k})
53 | public export %inline
54 | {n : _} -> Finite (Fin n) where