97 lines
2.4 KiB
Plaintext
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
|