procedure eachValue; overload eachValue(fn, x, ...xs) { fn(x); eachValue(fn, ...xs); } overload eachValue(fn) { } procedure mapValues; overload mapValues(fn, x, ...xs) = ...fn(x), mapValues(fn, ...xs); overload mapValues(fn) = ; procedure foldValues; overload foldValues(fn, x, ...xs) = fn(x, foldValues(fn, ...xs)); overload foldValues(fn, x) = x; procedure weaveValues; overload weaveValues(between, x, ...xs) = x, between, ...weaveValues(between, ...xs); overload weaveValues(between, x, y) = x, between, y; overload weaveValues(between, x) = x;