/
CDC-1.2b/
CDC-1.2b/src/
parent $libraries
object $set

var $root child_index 0
var $root owners [$set]
var $root owned [$set]
var $root fertile 0
var $root inited 1
var $root manager $set
var $root writable [$set]
var $root readable ['parameters, 'methods, 'code]
var $root dbref 'set

method difference
    arg [args];
    var set, list, element;
    
    // Usage:  diff(set 1, set 2, ..., set n)
    // Returns all elements of set 1 that are not in sets 2..n
    if (!args)
        return [];
    set = args[1];
    for list in (delete(args, 1)) {
        for element in (list)
            set = setremove(set, element);
    }
    return set;
.

method contains
    arg [args];
    var super, list, element;
    
    // True if the first list given is a superset of all subsequent lists.
    // False otherwise.  [] is a superset of [] and nothing else; anything is
    // a superset of [].  If only one list is given, return true.
    super = args ? args[1] | [];
    for list in (delete(args, 1)) {
        for element in (list) {
            if (!(element in super))
                return 0;
        }
    }
    return 1;
.

method equal
    arg set1, set2;
    var element;
    
    // True if the two lists given contain the same elements.
    // False otherwise.
    while (set1) {
        element = set1[1];
        if ((!element) in set2)
            return 0;
        while (element in set2)
            set2 = setremove(set2, element);
        while (element in set1)
            set1 = setremove(set1, element);
    }
    return set2 == [];
.