úÎ!Yÿ      portable  experimental Drew Day<drewday@gmail.com>  Safe-Infered!This implementation avoids using  S.Set (a,b) because ? it it is necessary to search for an item without knowing both D and R. In S.Set', you must know both values to search. 0Thus, we have are two maps to updated together.  7 Always be careful with the associated set of the key. ? If you union two relations, apply union to the set of values. = If you subtract, take care when handling the set of values. >As a multi-map, each key is asscoated with a Set of values v. *We do not allow the associations with the  Set. size r/ returns the number of tuples in the relation. 'Construct a relation with no elements. @The list must be formatted like: [(k1, v1), (k2, v2),..,(kn, vn)]. Builds a List from a Relation.  Builds a & consiting of an association between: x and y. The / that results from the union of two relations: r and s. $Union a list of relations using the  relation. Insert a relation  x  and  y  in the relation  r  'Delete an association in the relation. 9The Set of values associated with a value in the domain. 8The Set of values associated with a value in the range. True if the element  x  exists in the domain of  r . )True if the element exists in the range. True if the relation r is the  relation. .True if the relation contains the association x and y True if the relation does not contain the association x and y ?Returns the domain in the relation, as a Set, in its entirety. >Returns the range of the relation, as a Set, in its entirety. 1A compact set of sets the values of which can be  Just (Set x) or Nothing.  The cases of  are purged. It is similar to .  (Case b <| r a) ( Case a |> r b )1Domain restriction for a relation. Modeled on z. 0Range restriction for a relation. Modeled on z.           relation-0.2 Data.RelationRelationsizeemptyfromListtoList singletonunionunionsinsertdelete lookupDom lookupRan memberDom memberRannullmember notMemberdomran compactSet<$||$><||>base Data.MaybeNothingGHC.Listconcat