25 lines
742 B
Plaintext
25 lines
742 B
Plaintext
procedure deepcopy(A, cache) #: return a deepcopy of A
|
|
local k
|
|
|
|
/cache := table() # used to handle multireferenced objects
|
|
if \cache[A] then return cache[A]
|
|
|
|
case type(A) of {
|
|
"table"|"list": {
|
|
cache[A] := copy(A)
|
|
every cache[A][k := key(A)] := deepcopy(A[k], cache)
|
|
}
|
|
"set": {
|
|
cache[A] := set()
|
|
every insert(cache[A], deepcopy(!A, cache))
|
|
}
|
|
default: { # records and objects (encoded as records)
|
|
cache[A] := copy(A)
|
|
if match("record ",image(A)) then {
|
|
every cache[A][k := key(A)] := deepcopy(A[k], cache)
|
|
}
|
|
}
|
|
}
|
|
return .cache[A]
|
|
end
|