3 | import Data.SortedSet
6 | record ListSet v where
7 | constructor MkListSet
12 | empty : Eq v => ListSet v
13 | empty = MkListSet empty
16 | insert : v -> ListSet v -> ListSet v
17 | insert v (MkListSet vs) = MkListSet $
v :: vs
19 | public export %inline
20 | insert' : ListSet v -> v -> ListSet v
21 | insert' = flip insert
24 | contains : v -> ListSet v -> Bool
25 | contains v (MkListSet vs) = elem v vs
27 | public export %inline
28 | contains' : ListSet v -> v -> Bool
29 | contains' = flip contains
32 | singleton : Eq v => v -> ListSet v
33 | singleton = MkListSet . singleton
36 | fromList : Eq v => List v -> ListSet v
37 | fromList = MkListSet
40 | normalise : ListSet v -> ListSet v
41 | normalise (MkListSet vs) = MkListSet $
nub vs
44 | (.asList) : ListSet v -> List v
45 | (.asList) = rawValues . normalise
49 | union : (x, y : ListSet v) -> ListSet v
50 | union (MkListSet @{eq} xs) (MkListSet ys) = MkListSet @{eq} $
xs ++ ys
55 | difference : (x, y : ListSet v) -> ListSet v
56 | difference (MkListSet @{eq} xs) (MkListSet ys) = MkListSet @{eq} $
(xs \\ ys) @{eq}
60 | symDifference : (x, y : ListSet v) -> ListSet v
61 | symDifference x y = union (difference x y) (difference y x)
65 | intersection : (x, y : ListSet v) -> ListSet v
66 | intersection x y = difference x (difference x y)
68 | public export %inline
69 | toSortedSet : Ord v => ListSet v -> SortedSet v
70 | toSortedSet = fromList . rawValues
73 | Ord k => Semigroup (ListSet k) where
77 | Ord k => Monoid (ListSet k) where
81 | Show k => Show (ListSet k) where
82 | show m = "fromList " ++ show (rawValues m)
85 | Foldable ListSet where
86 | foldr f init = foldr f init . (.asList)
87 | foldl f init = foldl f init . (.asList)
88 | null $
MkListSet vs = null vs
89 | foldlM f init = foldlM f init . (.asList)