0 | module Libraries.Data.List.SizeOf
3 | import Data.List.HasLength
4 | import Libraries.Data.List.HasLength
9 | record SizeOf {a : Type} (xs : List a) where
10 | constructor MkSizeOf
12 | 0 hasLength : HasLength size xs
15 | 0 theList : SizeOf {a} xs -> List a
23 | suc : SizeOf as -> SizeOf (a :: as)
24 | suc (MkSizeOf n p) = MkSizeOf (S n) (S p)
28 | sucR : SizeOf as -> SizeOf (as ++ [a])
29 | sucR (MkSizeOf n p) = MkSizeOf (S n) (sucR p)
32 | (+) : SizeOf xs -> SizeOf ys -> SizeOf (xs ++ ys)
33 | MkSizeOf m p + MkSizeOf n q = MkSizeOf (m + n) (hasLengthAppend p q)
36 | mkSizeOf : (xs : List a) -> SizeOf xs
37 | mkSizeOf xs = MkSizeOf (length xs) (hasLength xs)
40 | reverse : SizeOf xs -> SizeOf (reverse xs)
41 | reverse (MkSizeOf n p) = MkSizeOf n (hasLengthReverse p)
44 | map : SizeOf xs -> SizeOf (map f xs)
45 | map (MkSizeOf n p) = MkSizeOf n (cast (sym $
lengthMap xs) p)
48 | take : {n : Nat} -> {0 xs : Stream a} -> SizeOf (take n xs)
49 | take = MkSizeOf n (take n xs)
54 | data SizedView : SizeOf as -> Type where
55 | Z : SizedView (MkSizeOf Z Z)
56 | S : (n : SizeOf as) -> SizedView (suc {a} n)
59 | sizedView : (p : SizeOf as) -> SizedView p
60 | sizedView (MkSizeOf Z Z) = Z
61 | sizedView (MkSizeOf (S n) (S p)) = S (MkSizeOf n p)