integer set1 = new_dict(), set2 = new_dict() setd(3,0,set1) setd(1,0,set1) setd(2,0,set1) setd(5,0,set2) setd(3,0,set2) setd(4,0,set2) function element(object x, integer set) return getd_index(x,set)!=0 end function function u_visitor(object key, object data, object user_data) integer {union_set,set2} = user_data if set2=0 or not element(key,union_set) then setd(key,data,union_set) end if return 1 end function function union(integer set1, integer set2) integer union_set = new_dict() traverse_dict(routine_id("u_visitor"),{union_set,0},set1) traverse_dict(routine_id("u_visitor"),{union_set,set2},set2) return union_set end function function i_visitor(object key, object data, object user_data) integer {union_set,set2} = user_data if element(key,set2) then setd(key,data,union_set) end if return 1 end function function intersection(integer set1, integer set2) integer union_set = new_dict() traverse_dict(routine_id("i_visitor"),{union_set,set2},set1) return union_set end function function d_visitor(object key, object data, object user_data) integer {union_set,set2} = user_data if not element(key,set2) then setd(key,data,union_set) end if return 1 end function function difference(integer set1, integer set2) integer union_set = new_dict() traverse_dict(routine_id("d_visitor"),{union_set,set2},set1) return union_set end function integer res function s_visitor(object key, object data, object user_data) integer set2 = user_data if not element(key,set2) then res = 0 return 0 -- cease traversal end if return 1 end function function subset(integer set1, integer set2) res = 1 traverse_dict(routine_id("s_visitor"),set2,set1) return res end function function equality(integer set1, integer set2) if dict_size(set1)!=dict_size(set2) then return false end if return subset(set1,set2) end function include builtins/map.e -- for keys() -- matching test code: ?element(3,set1) -- 1 ?element(4,set1) -- 0 ?keys(union(set1,set2)) -- {1,2,3,4,5} ?keys(intersection(set1,set2)) -- {3} ?keys(difference(set1,set2)) -- {1,2} ?subset(set1,set2) -- 0 integer set3 = new_dict() setd(2,0,set3) setd(1,0,set3) ?subset(set3,set1) -- 1 ?equality(set1,set2) -- 0 setd(3,0,set3) ?equality(set1,set3) -- 1