{"ScriptPreparationCode":"window.round = (value, decimalScale) =\u003E {\r\n const scale = Math.pow(10, decimalScale);\r\n return Math.round(value * scale) / scale;\r\n}\r\n\r\nwindow.snap = (value, increment) =\u003E {\r\n return Math.round(value / increment) * increment;\r\n}\r\n\r\nwindow.clamp = (value, min, max) =\u003E {\r\n return Math.min(Math.max(value, min), max);\r\n}\r\n\r\nconst noop = () =\u003E {};\r\n\r\nconst curry = (fn, right) =\u003E (...args) =\u003E right ? v =\u003E fn(...args, v) : v =\u003E fn(v, ...args);\r\n\r\nconst chain = fn =\u003E (...args) =\u003E {\r\n const result = fn(...args);\r\n return new Proxy(noop, {\r\n apply: (_, __, [value]) =\u003E result(value),\r\n get: (_, prop) =\u003E chain((...nextArgs) =\u003E {\r\n const nextResult = utils[prop](...nextArgs);\r\n return value =\u003E nextResult(result(value));\r\n })\r\n });\r\n}\r\n\r\nconst makeChainable = (fn, right = 0) =\u003E (...args) =\u003E (args.length \u003C fn.length ? chain(curry(fn, right)) : fn)(...args);\r\n\r\nwindow.utils = {\r\n round: makeChainable(round),\r\n snap: makeChainable(snap),\r\n clamp: makeChainable(clamp),\r\n};\r\n\r\nconst randomNumber = Math.random();\r\nwindow.cachedRaw = v =\u003E round(clamp(snap(v, 10.2222), 20.5555, 40.5555), 2);\r\nwindow.cachedDirect = v =\u003E utils.round(utils.clamp(utils.snap(v, 10.2222), 20.5555, 40.5555), 2);\r\nwindow.cachedChain = utils.snap(10.2222).clamp(20.5555, 40.5555).round(2);","TestCases":[{"Name":"Raw","Code":"cachedRaw(Math.random() * 100);","IsDeferred":false},{"Name":"Direct","Code":"cachedDirect(Math.random() * 100);","IsDeferred":false},{"Name":"Chain","Code":"cachedChain(Math.random() * 100);","IsDeferred":false}]}