{"ScriptPreparationCode":"// Sort of like a recursive version of Ramda\u0027s \u0060where\u0060 (http://ramdajs.com/docs/#where).\r\nvar whereAll = R.curry((spec, obj) =\u003E {\r\n if (typeof obj === \u0022undefined\u0022) {\r\n if (spec === null || typeof spec === \u0022boolean\u0022) {\r\n return !spec\r\n }\r\n return false\r\n } else if (spec === false) {\r\n return false\r\n }\r\n var output = true\r\n R.forEachObjIndexed((v, k) =\u003E {\r\n if (v === null || typeof v === \u0022boolean\u0022 || R.keys(v).length) {\r\n if (!whereAll(v, obj[k])) {\r\n output = false\r\n }\r\n } else if (!v(obj[k])) {\r\n output = false\r\n }\r\n }, spec)\r\n return output\r\n})\r\n\r\n// -----------------------------------------------------------------------------\r\n\r\nvar data = [\r\n \u0027{ Z: 1 }\u0027,\r\n \u0022{ q: undefined }\u0022,\r\n \u0022{ q: null }\u0022,\r\n \u0022{ q: false }\u0022,\r\n \u0022{ q: true }\u0022,\r\n \u0022{ q: Infinity }\u0022,\r\n \u0022{ q: 1 }\u0022,\r\n \u0022{ q: 0 }\u0022,\r\n \u0022{ q: NaN }\u0022,\r\n \u0027{ q: \u0022\u0022 }\u0027,\r\n]\r\n\r\nvar specs = [\r\n \u0022{ q: null }\u0022,\r\n \u0022{ q: true }\u0022,\r\n \u0022{ q: false }\u0022,\r\n \u0022{ q: R.identity }\u0022,\r\n \u0022{ q: R.equals(true) }\u0022,\r\n \u0022{ q: R.equals(false) }\u0022,\r\n \u0022{ q: R.equals(null) }\u0022,\r\n \u0022{ q: R.equals(undefined) }\u0022,\r\n \u0022{ q: R.identical(true) }\u0022,\r\n \u0022{ q: R.identical(false) }\u0022,\r\n \u0022{ q: R.identical(null) }\u0022,\r\n \u0022{ q: R.identical(undefined) }\u0022,\r\n \u0022{ q: R.always(true) }\u0022,\r\n \u0022{ q: R.always(false) }\u0022,\r\n \u0022{ q: R.always(null) }\u0022,\r\n \u0022{ q: R.always(undefined) }\u0022,\r\n \u0022{ q: Infinity }\u0022,\r\n \u0022{ q: 1 }\u0022,\r\n \u0022{ q: 0 }\u0022,\r\n \u0022{ q: NaN }\u0022,\r\n \u0027{ q: \u0022\u0022 }\u0027,\r\n \u0022{ q: [] }\u0022,\r\n \u0022{ q: {} }\u0022,\r\n \u0022{ q: undefined }\u0022,\r\n]\r\n\r\n// In the truth table that gets generated, \u0060false\u0060 is omitted and errors\r\n// are shown as \u0060\u22A5\u0060 for sake of readability.\r\nfunction generateTruthTable(f) {\r\n var table = {}\r\n for (var i in specs) {\r\n var row = {}\r\n var spec = eval(\u0022(\u0022 \u002B specs[i] \u002B \u0022)\u0022)\r\n for (var j in data) {\r\n var r\r\n try {\r\n r = f(spec, eval(\u0022(\u0022 \u002B data[j] \u002B \u0022)\u0022))\r\n } catch (_) {\r\n r = \u0022\u22A5\u0022\r\n }\r\n if (r) row[data[j]] = r\r\n }\r\n table[specs[i]] = row\r\n }\r\n return table\r\n}\r\n","TestCases":[{"Name":"Using \u0060R.where\u0060","Code":"generateTruthTable(R.where)","IsDeferred":false},{"Name":"Using \u0060whereAll\u0060","Code":"generateTruthTable(whereAll)","IsDeferred":false}]}