0 | module Libraries.Data.SnocList.HasLength
5 | import Data.List.HasLength as L
8 | LHasLength : Nat -> List a -> Type
9 | LHasLength = L.HasLength
14 | data HasLength : Nat -> SnocList a -> Type where
16 | S : HasLength n sa -> HasLength (S n) (sa :< a)
19 | hasLength : HasLength n sx -> length sx === n
21 | hasLength (S p) = cong S (hasLength p)
24 | sucR : HasLength n sx -> HasLength (S n) (sx ++ [<x])
28 | sucL : HasLength n sx -> HasLength (S n) ([<x] ++ sx)
30 | sucL (S n) = S (sucL n)
33 | hlAppend : HasLength m sx -> HasLength n sy -> HasLength (n + m) (sx ++ sy)
35 | hlAppend sx (S sy) = S (hlAppend sx sy)
38 | hlFish : HasLength m sx -> LHasLength n ys -> HasLength (n + m) (sx <>< ys)
40 | hlFish {n = S n} x (S y) = rewrite plusSuccRightSucc n m in hlFish (S x) y
43 | mkHasLength : (sx : SnocList a) -> HasLength (length sx) sx
45 | mkHasLength (sx :< _) = S (mkHasLength sx)
48 | hlChips : HasLength m sx -> LHasLength n ys -> LHasLength (m + n) (sx <>> ys)
50 | hlChips {m = S m} {n} (S x) y
51 | = rewrite plusSuccRightSucc m n in
62 | cast : {sy : _} -> (0 _ : SnocList.length sx = SnocList.length sy) ->
63 | HasLength m sx -> HasLength m sy
64 | cast {sy = [<]} eq Z = Z
65 | cast {sy = sy :< _} eq (S p) = S (cast (injective eq) p)
67 | hlReverseOnto : HasLength m acc -> HasLength n sx -> HasLength (m + n) (reverseOnto acc sx)
68 | hlReverseOnto p Z = rewrite plusZeroRightNeutral m in p
69 | hlReverseOnto {n = S n} p (S q) = rewrite sym (plusSuccRightSucc m n) in hlReverseOnto (S p) q
72 | hlReverse : HasLength m acc -> HasLength m (reverse acc)
73 | hlReverse = hlReverseOnto Z