(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