0 | module Data.FVect.Capacity
4 | import Decidable.Equality
8 | -> Either (finToNat x `LT` n) (finToNat x = n)
9 | finPrf {n = 0} FZ = Right Refl
10 | finPrf {n = (S k)} FZ = Left (LTESucc LTEZero)
11 | finPrf {n = (S k)} (FS x) = bimap LTESucc (\p => cong S p) $
finPrf x
19 | data Capacity : Type -> Type where
20 | Full : (0 eqPrf : finToNat l = c)
21 | -> Capacity (FVect c l e)
22 | NotFull : {0 n : Nat}
23 | -> {0 len : Fin (S (S n))}
24 | -> (0 ltPrf : (finToNat len) `LT` (S n))
25 | -> Capacity (FVect (S n) len e)
29 | capacity : {c : Nat}
31 | -> (0 _ : FVect c l e)
32 | -> Capacity (FVect c l e)
33 | capacity {c} _ with (finPrf l)
34 | capacity {c} _ | (Right eq) = Full eq
35 | capacity {c = (S k)} _ | (Left lte) = NotFull lte
39 | capacity' : {c : Nat}
40 | -> {0 l : Fin (S c)}
42 | -> Capacity (FVect c l e)
43 | capacity' {c = 0} [] = Full Refl
44 | capacity' {c = (S k)} [] = NotFull (LTESucc LTEZero)
45 | capacity' {c = (S k)} (x :: xs) with (capacity' xs)
46 | capacity' {c = (S k)} (x :: xs) | (Full eqPrf) =
47 | Full (rewrite eqPrf in Refl)
48 | capacity' {c = (S (S n))} (x :: xs) | (NotFull ltPrf) =
49 | NotFull (LTESucc ltPrf)