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 |]
51 | allFinsLinear : (n : Nat) -> List (Fin n)
52 | allFinsLinear 0 = []
53 | allFinsLinear (S n) = go [] last
55 | go : List (Fin k) -> Fin k -> List (Fin k)
57 | go xs (FS x) = go (FS x :: xs) (assert_smaller (FS x) $
weaken x)
59 | public export %inline
60 | {n : _} -> Finite (Fin n) where
61 | values = allFinsLinear n