0 | module Data.SnocList.HasLength
7 | import Data.List.HasLength as L
10 | LHasLength : Nat -> List a -> Type
11 | LHasLength = L.HasLength
16 | data HasLength : Nat -> SnocList a -> Type where
18 | S : HasLength n sa -> HasLength (S n) (sa :< a)
21 | hasLength : HasLength n sx -> length sx === n
23 | hasLength (S p) = cong S (hasLength p)
26 | map : (f : a -> b) -> HasLength n xs -> HasLength n (map f xs)
28 | map f (S hl) = S (map f hl)
31 | sucL : HasLength n sx -> HasLength (S n) ([<x] ++ sx)
33 | sucL (S n) = S (sucL n)
36 | sucR : HasLength n sx -> HasLength (S n) (sx ++ [<x])
40 | hlAppend : HasLength m sx -> HasLength n sy -> HasLength (n + m) (sx ++ sy)
42 | hlAppend sx (S sy) = S (hlAppend sx sy)
45 | hlFish : HasLength m sx -> LHasLength n ys -> HasLength (n + m) (sx <>< ys)
47 | hlFish {n = S n} x (S y) = rewrite plusSuccRightSucc n m in hlFish (S x) y
50 | mkHasLength : (sx : SnocList a) -> HasLength (length sx) sx
52 | mkHasLength (sx :< _) = S (mkHasLength sx)
55 | hlChips : HasLength m sx -> LHasLength n ys -> LHasLength (m + n) (sx <>> ys)
57 | hlChips {m = S m} {n} (S x) y
58 | = 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