(phixonline)--> with javascript_semantics function create_set(sequence s={}) integer res = new_dict() for i=1 to length(s) do setd(s[i],0,res) end for return res end function 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 set_union(integer set1, integer set2) integer union_set = new_dict() traverse_dict(u_visitor,{union_set,0},set1) traverse_dict(u_visitor,{union_set,set2},set2) return union_set end function function i_visitor(object key, object data, object user_data) integer {inter_sect,set2} = user_data if element(key,set2) then setd(key,data,inter_sect) end if return 1 end function function set_intersection(integer set1, integer set2) integer inter_sect = new_dict() traverse_dict(i_visitor,{inter_sect,set2},set1) return inter_sect end function function d_visitor(object key, object data, object user_data) integer {diff_set,set2} = user_data if not element(key,set2) then setd(key,data,diff_set) end if return 1 end function function set_difference(integer set1, integer set2) integer diff_set = new_dict() traverse_dict(d_visitor,{diff_set,set2},set1) return diff_set end function bool subset_res function s_visitor(object key, object data, object user_data) integer set2 = user_data if not element(key,set2) then subset_res = false return 0 -- cease traversal end if return 1 end function function subset(integer set1, integer set2) subset_res = true traverse_dict(s_visitor,set2,set1) return subset_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: integer set1 = create_set({3,1,2}), set2 = create_set({5,3,4}), set3 = create_set({2,1}) ?element(3,set1) -- 1 ?element(4,set1) -- 0 ?keys(set_union(set1,set2)) -- {1,2,3,4,5} ?keys(set_intersection(set1,set2)) -- {3} ?keys(set_difference(set1,set2)) -- {1,2} ?subset(set1,set2) -- 0 ?subset(set3,set1) -- 1 ?equality(set1,set2) -- 0 setd(3,0,set3) ?equality(set1,set3) -- 1