0 | module Libraries.Data.SnocList.SizeOf
3 | import Libraries.Data.SnocList.HasLength
7 | import Libraries.Data.List.SizeOf as L
10 | 0 LSizeOf : {0 a : Type} -> List a -> Type
11 | LSizeOf xs = L.SizeOf xs
19 | record SizeOf {a : Type} (sx : SnocList a) where
20 | constructor MkSizeOf
22 | 0 hasLength : HasLength size sx
25 | 0 theList : SizeOf {a} sx -> SnocList a
33 | (:<) : SizeOf as -> (0 a : _) -> SizeOf (as :< a)
34 | MkSizeOf n p :< _ = MkSizeOf (S n) (S p)
41 | suc : SizeOf as -> SizeOf (as :< a)
42 | suc (MkSizeOf n p) = MkSizeOf (S n) (S p)
46 | sucL : SizeOf as -> SizeOf ([<a] ++ as)
47 | sucL (MkSizeOf n p) = MkSizeOf (S n) (sucL p)
50 | (<><) : SizeOf {a} sx -> LSizeOf {a} ys -> SizeOf (sx <>< ys)
51 | MkSizeOf m p <>< MkSizeOf n q = MkSizeOf (n + m) (hlFish p q)
54 | (<>>) : SizeOf {a} sx -> LSizeOf {a} ys -> LSizeOf (sx <>> ys)
55 | MkSizeOf m p <>> MkSizeOf n q = MkSizeOf (m + n) (hlChips p q)
58 | cast : LSizeOf {a} xs -> SizeOf {a} (cast xs)
62 | (+) : SizeOf sx -> SizeOf sy -> SizeOf (sx ++ sy)
63 | MkSizeOf m p + MkSizeOf n q = MkSizeOf (n + m) (hlAppend p q)
66 | mkSizeOf : (sx : SnocList a) -> SizeOf sx
67 | mkSizeOf sx = MkSizeOf (length sx) (mkHasLength sx)
70 | reverse : SizeOf sx -> SizeOf (reverse sx)
71 | reverse (MkSizeOf n p) = MkSizeOf n (hlReverse p)
74 | map : SizeOf sx -> SizeOf (map f sx)
75 | map (MkSizeOf n p) = MkSizeOf n (cast (sym $
lengthMap sx) p) where
77 | lengthMap : (sx : _) -> SnocList.length (map f sx) === SnocList.length sx
78 | lengthMap [<] = Refl
79 | lengthMap (sx :< x) = cong S (lengthMap sx)
90 | data SizedView : SizeOf as -> Type where
92 | S : (n : SizeOf as) -> SizedView (n :< a)
95 | sizedView : (p : SizeOf as) -> SizedView p
96 | sizedView (MkSizeOf Z Z) = Z
97 | sizedView (MkSizeOf (S n) (S p)) = S (MkSizeOf n p)