@@ -0,0 +1,50 @@
1+module Set
2+
3+public export
4+interface SetSig a where
5+ data Set : Type -> Type where MkSet : List a -> Set a
6+
7+ new : Set a
8+ insert : a -> Set a -> Set a
9+ member : a -> Set a -> Bool
10+
11+data Tree a = Leaf | Node (Tree a) a (Tree a)
12+
13+mkTree : Type -> Type
14+mkTree = Tree
15+
16+namespace TreeSet
17+ export
18+ [TreeSet] Ord a => SetSig a where
19+
20+ Set = Tree
21+
22+ new = Leaf
23+
24+ insert x Leaf = Node Leaf x Leaf
25+ insert x (Node l val r) = case compare x val of
26+ LT => Node (insert x l) val r
27+ EQ => Node l val r
28+ GT => Node l val (insert x r)
29+
30+ member x Leaf = False
31+ member x (Node l val r) = case compare x val of
32+ LT => member x l
33+ EQ => True
34+ GT => member x r
35+
36+using implementation TreeSet
37+
38+ test : Set @{TreeSet {a=Nat}} Nat
39+ test = insert 3 $
40+ insert 2 $
41+ insert 7 $
42+ insert 3 $
43+ insert 4 $
44+ insert 5 new
45+
46+ foo : Bool
47+ foo = member 6 test
48+
49+ bar : Bool
50+ bar = member 3 test