data IsSuffixOf : List a -> List a -> TypeSuffixRefl : IsSuffixOf xs xsConsSuffix : IsSuffixOf xs ys -> IsSuffixOf xs (y :: ys)Preorder (List a) IsSuffixOfReflexive (List a) IsSuffixOfTransitive (List a) IsSuffixOfappendIsSuffix : (xs : List a) -> (ys : List a) -> IsSuffixOf ys (xs ++ ys)suffixLengthLTE : (xs : List a) -> (ys : List a) -> IsSuffixOf xs ys -> LTE (length xs) (length ys)record DiffList : Type -> TypeA diff-list takes a list, and appends new elements on the front
This allows for cheap concatenation, no matter how it is associated
This implementation includes a proof that the function can only append
elements to the front
MkDiffList : (append : (List a -> List a)) -> (0 _ : ((rest : List a) -> IsSuffixOf rest (append rest))) -> DiffList a.append : DiffList a -> List a -> List a0 .isSuffix : ({rec:0} : DiffList a) -> (rest : List a) -> IsSuffixOf rest (append {rec:0} rest).append : DiffList a -> List a -> List aappend : DiffList a -> List a -> List a0 .isSuffix : ({rec:0} : DiffList a) -> (rest : List a) -> IsSuffixOf rest (append {rec:0} rest)0 isSuffix : ({rec:0} : DiffList a) -> (rest : List a) -> IsSuffixOf rest (append {rec:0} rest)Nil : DiffList a(::) : a -> DiffList a -> DiffList atoList : DiffList a -> List adiffAppendIsSuffix : (xs : DiffList a) -> (ys : DiffList a) -> (rest : List a) -> IsSuffixOf rest (xs .append (ys .append rest))singleton : a -> DiffList afromList : List a -> DiffList aDiffListEq : DiffList a -> DiffList a -> TypeEquality of `DiffList`s is represented as equality of `DiffList.toList` of each side
(.==) : DiffList a -> DiffList a -> TypesemigroupAssoc : (xs : DiffList a) -> (ys : DiffList a) -> (zs : DiffList a) -> ((xs <+> ys) <+> zs) .== (xs <+> (ys <+> zs))toListFromListId : (xs : List a) -> toList (fromList xs) = xssemigroupNilRightNeutral : (xs : DiffList a) -> (xs <+> []) .== xssemigroupNilLeftNeutral : (xs : DiffList a) -> ([] <+> xs) .== xs