summaryrefslogtreecommitdiff
path: root/1415/fp2/week3/camil/StdDynSet.icl
diff options
context:
space:
mode:
authorCamil Staps2016-02-02 19:24:50 +0100
committerCamil Staps2016-02-02 19:24:50 +0100
commita7d7542dc646a5fd124ef71e71ce260889f1701b (patch)
tree04ed89503bbb3cc9933273a1326a53ca724c3492 /1415/fp2/week3/camil/StdDynSet.icl
parentweek6 camil: working positioning of lines by putting empties at left and righ... (diff)
Moved to 1415 directoryHEADmaster
Diffstat (limited to '1415/fp2/week3/camil/StdDynSet.icl')
-rw-r--r--1415/fp2/week3/camil/StdDynSet.icl62
1 files changed, 62 insertions, 0 deletions
diff --git a/1415/fp2/week3/camil/StdDynSet.icl b/1415/fp2/week3/camil/StdDynSet.icl
new file mode 100644
index 0000000..576bec9
--- /dev/null
+++ b/1415/fp2/week3/camil/StdDynSet.icl
@@ -0,0 +1,62 @@
+// Mart Lubbers s4109503, Camil Staps s4498062
+
+implementation module StdDynSet
+
+import StdEnv
+import StdMaybe
+import StdDynamic
+
+isEqual:: Dynamic t -> Bool | Set t
+isEqual (x :: t^) a = x == a
+isEqual _ _ = False
+
+class Set a | TC, ==, toString a
+
+:: Set = Set [(Dynamic, Dynamic -> Bool, String)]
+
+instance zero Set
+where zero = Set []
+
+instance toString Set
+where toString (Set [(_,_,a):as]) = "{" +++ a +++ (foldl (+++) "" ["," +++ s \\ (_,_,s) <- as]) +++ "}"
+
+instance == Set
+where == a b = nrOfElts a == nrOfElts b && isSubset a b
+
+toSet :: a -> Set | Set a
+toSet e = Set [(dynamic e, \x = isEqual x e, toString e)]
+
+nrOfElts :: Set -> Int
+nrOfElts (Set a) = length a
+
+isEmptySet :: Set -> Bool
+isEmptySet a = (nrOfElts a) == 0
+
+memberOfSet :: a Set -> Bool | Set a
+memberOfSet _ (Set []) = False
+memberOfSet x (Set [(y,_,_):ys]) = isEqual y x || memberOfSet x (Set ys)
+
+dynMemberOfSet :: Dynamic Set -> Bool
+dynMemberOfSet _ (Set []) = False
+dynMemberOfSet x (Set [(_,eq,_):ys]) = eq x || dynMemberOfSet x (Set ys)
+
+isSubset :: Set Set -> Bool
+isSubset a b = (nrOfElts a) == (nrOfElts (intersection a b))
+
+isStrictSubset :: Set Set -> Bool
+isStrictSubset a b = isSubset a b && nrOfElts a < nrOfElts b
+
+union :: Set Set -> Set
+union (Set a) (Set b) = Set (a ++ (fromSet (without (Set b) (Set a))))
+where
+ fromSet :: Set -> [(Dynamic, Dynamic -> Bool, String)]
+ fromSet (Set x) = x
+
+intersection :: Set Set -> Set
+intersection as (Set []) = as
+intersection (Set as) (Set bs) = Set [(a,eq,ts) \\ (a,eq,ts) <- as | dynMemberOfSet a (Set bs)]
+
+without :: Set Set -> Set
+without (Set as) (Set bs) = Set [(a,eq,ts) \\ (a,eq,ts) <- as | not (dynMemberOfSet a (Set bs))]
+
+Start = toString (union (toSet 1) (toSet 2))