RosettaCodeData/Task/Set/Phix/set-2.phix

97 lines
2.4 KiB
Plaintext

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