[{"data":1,"prerenderedAt":4468},["ShallowReactive",2],{"page-\u002Fjs\u002F13-higher-order-functions":3},{"id":4,"title":5,"body":6,"description":4461,"extension":4462,"meta":4463,"navigation":52,"path":4464,"seo":4465,"stem":4466,"__hash__":4467},"content\u002Fjs\u002F13-higher-order-functions.md","JavaScript 13 — Higher-Order Functions: Composition, Currying & Partial Application",{"type":7,"value":8,"toc":4451},"minimark",[9,14,19,575,579,1203,1207,1895,1899,2449,2453,3246,3250,3860,3864,4212,4216,4220,4351,4447],[10,11,13],"h1",{"id":12},"_13-higher-order-functions-composition-currying-partial-application","13 — Higher-Order Functions: Composition, Currying & Partial Application",[15,16,18],"h2",{"id":17},"map-filter-reduce-the-functional-trinity","Map, Filter, Reduce: The Functional Trinity",[20,21,23],"code-wrapper",{"language":22},"javascript",[24,25,29],"pre",{"className":26,"code":27,"language":22,"meta":28,"style":28},"language-javascript shiki shiki-themes github-light github-dark","\u002F\u002F ── A higher-order function takes or returns a function ──\n\u002F\u002F map, filter, reduce are the foundation of functional array processing.\n\n\u002F\u002F ── map: transform each element (1:1 mapping) ──\nconst doubled = [1, 2, 3].map(x => x * 2);  \u002F\u002F [2, 4, 6]\n\u002F\u002F map calls the callback for each element, collects results into a new array.\n\u002F\u002F Returns a new array of the SAME LENGTH (always — even if callback returns undefined).\n\n\u002F\u002F ── filter: select elements that pass a test (1:0 or 1:1) ──\nconst evens = [1, 2, 3, 4].filter(x => x % 2 === 0);  \u002F\u002F [2, 4]\n\u002F\u002F filter calls the callback for each element, keeps elements where callback returns truthy.\n\u002F\u002F Returns a new array (possibly shorter or empty).\n\n\u002F\u002F ── reduce: fold to a single value (N:1) ──\nconst sum = [1, 2, 3, 4].reduce((acc, x) => acc + x, 0);  \u002F\u002F 10\n\u002F\u002F reduce calls the callback with (accumulator, current) for each element.\n\u002F\u002F The accumulator carries state between calls. Initial value is the second argument.\n\u002F\u002F Step: 0+1=1, 1+2=3, 3+3=6, 6+4=10\n\n\u002F\u002F ── Composition: chain map\u002Ffilter\u002Freduce (each creates a new array) ──\nconst result = [1, 2, 3, 4, 5, 6]\n    .filter(x => x % 2 === 0)      \u002F\u002F [2, 4, 6]\n    .map(x => x * x)               \u002F\u002F [4, 16, 36]\n    .reduce((a, b) => a + b, 0);   \u002F\u002F 56\n\n\u002F\u002F ⚠️ Each step creates an intermediate array (3 arrays total).\n\u002F\u002F For large arrays, a single reduce is more efficient (one pass, no intermediates):\nconst efficient = [1, 2, 3, 4, 5, 6].reduce((acc, x) => {\n    if (x % 2 === 0) return acc + x * x;  \u002F\u002F filter + map + accumulate in one pass\n    return acc;\n}, 0);  \u002F\u002F 56 (same result, one loop, no intermediate arrays)\n","",[30,31,32,41,47,54,60,124,130,136,141,147,203,209,215,220,226,290,296,302,308,313,319,358,387,410,447,452,458,464,517,553,562],"code",{"__ignoreMap":28},[33,34,37],"span",{"class":35,"line":36},"line",1,[33,38,40],{"class":39},"sdCPZ","\u002F\u002F ── A higher-order function takes or returns a function ──\n",[33,42,44],{"class":35,"line":43},2,[33,45,46],{"class":39},"\u002F\u002F map, filter, reduce are the foundation of functional array processing.\n",[33,48,50],{"class":35,"line":49},3,[33,51,53],{"emptyLinePlaceholder":52},true,"\n",[33,55,57],{"class":35,"line":56},4,[33,58,59],{"class":39},"\u002F\u002F ── map: transform each element (1:1 mapping) ──\n",[33,61,63,67,71,74,78,81,84,87,89,92,95,99,102,106,109,112,115,118,121],{"class":35,"line":62},5,[33,64,66],{"class":65},"svdQ7","const",[33,68,70],{"class":69},"snvgF"," doubled",[33,72,73],{"class":65}," =",[33,75,77],{"class":76},"ssxIu"," [",[33,79,80],{"class":69},"1",[33,82,83],{"class":76},", ",[33,85,86],{"class":69},"2",[33,88,83],{"class":76},[33,90,91],{"class":69},"3",[33,93,94],{"class":76},"].",[33,96,98],{"class":97},"sIsaT","map",[33,100,101],{"class":76},"(",[33,103,105],{"class":104},"sCrzJ","x",[33,107,108],{"class":65}," =>",[33,110,111],{"class":76}," x ",[33,113,114],{"class":65},"*",[33,116,117],{"class":69}," 2",[33,119,120],{"class":76},");  ",[33,122,123],{"class":39},"\u002F\u002F [2, 4, 6]\n",[33,125,127],{"class":35,"line":126},6,[33,128,129],{"class":39},"\u002F\u002F map calls the callback for each element, collects results into a new array.\n",[33,131,133],{"class":35,"line":132},7,[33,134,135],{"class":39},"\u002F\u002F Returns a new array of the SAME LENGTH (always — even if callback returns undefined).\n",[33,137,139],{"class":35,"line":138},8,[33,140,53],{"emptyLinePlaceholder":52},[33,142,144],{"class":35,"line":143},9,[33,145,146],{"class":39},"\u002F\u002F ── filter: select elements that pass a test (1:0 or 1:1) ──\n",[33,148,150,152,155,157,159,161,163,165,167,169,171,174,176,179,181,183,185,187,190,192,195,198,200],{"class":35,"line":149},10,[33,151,66],{"class":65},[33,153,154],{"class":69}," evens",[33,156,73],{"class":65},[33,158,77],{"class":76},[33,160,80],{"class":69},[33,162,83],{"class":76},[33,164,86],{"class":69},[33,166,83],{"class":76},[33,168,91],{"class":69},[33,170,83],{"class":76},[33,172,173],{"class":69},"4",[33,175,94],{"class":76},[33,177,178],{"class":97},"filter",[33,180,101],{"class":76},[33,182,105],{"class":104},[33,184,108],{"class":65},[33,186,111],{"class":76},[33,188,189],{"class":65},"%",[33,191,117],{"class":69},[33,193,194],{"class":65}," ===",[33,196,197],{"class":69}," 0",[33,199,120],{"class":76},[33,201,202],{"class":39},"\u002F\u002F [2, 4]\n",[33,204,206],{"class":35,"line":205},11,[33,207,208],{"class":39},"\u002F\u002F filter calls the callback for each element, keeps elements where callback returns truthy.\n",[33,210,212],{"class":35,"line":211},12,[33,213,214],{"class":39},"\u002F\u002F Returns a new array (possibly shorter or empty).\n",[33,216,218],{"class":35,"line":217},13,[33,219,53],{"emptyLinePlaceholder":52},[33,221,223],{"class":35,"line":222},14,[33,224,225],{"class":39},"\u002F\u002F ── reduce: fold to a single value (N:1) ──\n",[33,227,229,231,234,236,238,240,242,244,246,248,250,252,254,257,260,263,265,267,270,273,276,279,282,285,287],{"class":35,"line":228},15,[33,230,66],{"class":65},[33,232,233],{"class":69}," sum",[33,235,73],{"class":65},[33,237,77],{"class":76},[33,239,80],{"class":69},[33,241,83],{"class":76},[33,243,86],{"class":69},[33,245,83],{"class":76},[33,247,91],{"class":69},[33,249,83],{"class":76},[33,251,173],{"class":69},[33,253,94],{"class":76},[33,255,256],{"class":97},"reduce",[33,258,259],{"class":76},"((",[33,261,262],{"class":104},"acc",[33,264,83],{"class":76},[33,266,105],{"class":104},[33,268,269],{"class":76},") ",[33,271,272],{"class":65},"=>",[33,274,275],{"class":76}," acc ",[33,277,278],{"class":65},"+",[33,280,281],{"class":76}," x, ",[33,283,284],{"class":69},"0",[33,286,120],{"class":76},[33,288,289],{"class":39},"\u002F\u002F 10\n",[33,291,293],{"class":35,"line":292},16,[33,294,295],{"class":39},"\u002F\u002F reduce calls the callback with (accumulator, current) for each element.\n",[33,297,299],{"class":35,"line":298},17,[33,300,301],{"class":39},"\u002F\u002F The accumulator carries state between calls. Initial value is the second argument.\n",[33,303,305],{"class":35,"line":304},18,[33,306,307],{"class":39},"\u002F\u002F Step: 0+1=1, 1+2=3, 3+3=6, 6+4=10\n",[33,309,311],{"class":35,"line":310},19,[33,312,53],{"emptyLinePlaceholder":52},[33,314,316],{"class":35,"line":315},20,[33,317,318],{"class":39},"\u002F\u002F ── Composition: chain map\u002Ffilter\u002Freduce (each creates a new array) ──\n",[33,320,322,324,327,329,331,333,335,337,339,341,343,345,347,350,352,355],{"class":35,"line":321},21,[33,323,66],{"class":65},[33,325,326],{"class":69}," result",[33,328,73],{"class":65},[33,330,77],{"class":76},[33,332,80],{"class":69},[33,334,83],{"class":76},[33,336,86],{"class":69},[33,338,83],{"class":76},[33,340,91],{"class":69},[33,342,83],{"class":76},[33,344,173],{"class":69},[33,346,83],{"class":76},[33,348,349],{"class":69},"5",[33,351,83],{"class":76},[33,353,354],{"class":69},"6",[33,356,357],{"class":76},"]\n",[33,359,361,364,366,368,370,372,374,376,378,380,382,385],{"class":35,"line":360},22,[33,362,363],{"class":76},"    .",[33,365,178],{"class":97},[33,367,101],{"class":76},[33,369,105],{"class":104},[33,371,108],{"class":65},[33,373,111],{"class":76},[33,375,189],{"class":65},[33,377,117],{"class":69},[33,379,194],{"class":65},[33,381,197],{"class":69},[33,383,384],{"class":76},")      ",[33,386,123],{"class":39},[33,388,390,392,394,396,398,400,402,404,407],{"class":35,"line":389},23,[33,391,363],{"class":76},[33,393,98],{"class":97},[33,395,101],{"class":76},[33,397,105],{"class":104},[33,399,108],{"class":65},[33,401,111],{"class":76},[33,403,114],{"class":65},[33,405,406],{"class":76}," x)               ",[33,408,409],{"class":39},"\u002F\u002F [4, 16, 36]\n",[33,411,413,415,417,419,422,424,427,429,431,434,436,439,441,444],{"class":35,"line":412},24,[33,414,363],{"class":76},[33,416,256],{"class":97},[33,418,259],{"class":76},[33,420,421],{"class":104},"a",[33,423,83],{"class":76},[33,425,426],{"class":104},"b",[33,428,269],{"class":76},[33,430,272],{"class":65},[33,432,433],{"class":76}," a ",[33,435,278],{"class":65},[33,437,438],{"class":76}," b, ",[33,440,284],{"class":69},[33,442,443],{"class":76},");   ",[33,445,446],{"class":39},"\u002F\u002F 56\n",[33,448,450],{"class":35,"line":449},25,[33,451,53],{"emptyLinePlaceholder":52},[33,453,455],{"class":35,"line":454},26,[33,456,457],{"class":39},"\u002F\u002F ⚠️ Each step creates an intermediate array (3 arrays total).\n",[33,459,461],{"class":35,"line":460},27,[33,462,463],{"class":39},"\u002F\u002F For large arrays, a single reduce is more efficient (one pass, no intermediates):\n",[33,465,467,469,472,474,476,478,480,482,484,486,488,490,492,494,496,498,500,502,504,506,508,510,512,514],{"class":35,"line":466},28,[33,468,66],{"class":65},[33,470,471],{"class":69}," efficient",[33,473,73],{"class":65},[33,475,77],{"class":76},[33,477,80],{"class":69},[33,479,83],{"class":76},[33,481,86],{"class":69},[33,483,83],{"class":76},[33,485,91],{"class":69},[33,487,83],{"class":76},[33,489,173],{"class":69},[33,491,83],{"class":76},[33,493,349],{"class":69},[33,495,83],{"class":76},[33,497,354],{"class":69},[33,499,94],{"class":76},[33,501,256],{"class":97},[33,503,259],{"class":76},[33,505,262],{"class":104},[33,507,83],{"class":76},[33,509,105],{"class":104},[33,511,269],{"class":76},[33,513,272],{"class":65},[33,515,516],{"class":76}," {\n",[33,518,520,523,526,528,530,532,534,536,539,541,543,545,547,550],{"class":35,"line":519},29,[33,521,522],{"class":65},"    if",[33,524,525],{"class":76}," (x ",[33,527,189],{"class":65},[33,529,117],{"class":69},[33,531,194],{"class":65},[33,533,197],{"class":69},[33,535,269],{"class":76},[33,537,538],{"class":65},"return",[33,540,275],{"class":76},[33,542,278],{"class":65},[33,544,111],{"class":76},[33,546,114],{"class":65},[33,548,549],{"class":76}," x;  ",[33,551,552],{"class":39},"\u002F\u002F filter + map + accumulate in one pass\n",[33,554,556,559],{"class":35,"line":555},30,[33,557,558],{"class":65},"    return",[33,560,561],{"class":76}," acc;\n",[33,563,565,568,570,572],{"class":35,"line":564},31,[33,566,567],{"class":76},"}, ",[33,569,284],{"class":69},[33,571,120],{"class":76},[33,573,574],{"class":39},"\u002F\u002F 56 (same result, one loop, no intermediate arrays)\n",[15,576,578],{"id":577},"function-composition","Function Composition",[20,580,581],{"language":22},[24,582,584],{"className":26,"code":583,"language":22,"meta":28,"style":28},"\u002F\u002F ── compose: right-to-left function composition ──\n\u002F\u002F compose(f, g, h)(x) = f(g(h(x)))\nconst compose = (...fns) => (x) => fns.reduceRight((acc, fn) => fn(acc), x);\n\nconst square = x => x * x;\nconst addOne = x => x + 1;\nconst double = x => x * 2;\n\nconst transform = compose(double, addOne, square);\n\u002F\u002F Applied right-to-left: square(3)=9 → addOne(9)=10 → double(10)=20\nconsole.log(transform(3));  \u002F\u002F 20\n\n\u002F\u002F ── pipe: left-to-right composition (more intuitive reading order) ──\n\u002F\u002F pipe(f, g, h)(x) = h(g(f(x)))\nconst pipe = (...fns) => (x) => fns.reduce((acc, fn) => fn(acc), x);\n\nconst transformPipe = pipe(square, addOne, double);\n\u002F\u002F Applied left-to-right: square(3)=9 → addOne(9)=10 → double(10)=20\nconsole.log(transformPipe(3));  \u002F\u002F 20 (same result, different order)\n\n\u002F\u002F ── Async pipe (each function is async) ──\nconst pipeAsync = (...fns) => (x) =>\n    fns.reduce(async (acc, fn) => fn(await acc), x);\n\nconst asyncPipeline = pipeAsync(\n    async x => x + 1,     \u002F\u002F 5 → 6\n    async x => x * 2,     \u002F\u002F 6 → 12\n    async x => x - 3,     \u002F\u002F 12 → 9\n);\nasyncPipeline(5).then(console.log);  \u002F\u002F 9\n\n\u002F\u002F ── Compose with multiple arguments ──\nconst composeMulti = (...fns) => fns.reduceRight((f, g) => (...args) => f(g(...args)));\nconst addAndMultiply = composeMulti(\n    x => x * 2,           \u002F\u002F multiply by 2\n    (a, b) => a + b       \u002F\u002F add two numbers\n);\naddAndMultiply(3, 4);  \u002F\u002F (3+4)*2 = 14\n",[30,585,586,591,596,651,655,676,699,720,724,738,743,766,770,775,780,827,831,845,850,870,874,879,907,941,945,959,980,999,1020,1025,1046,1050,1056,1119,1133,1153,1179,1184],{"__ignoreMap":28},[33,587,588],{"class":35,"line":36},[33,589,590],{"class":39},"\u002F\u002F ── compose: right-to-left function composition ──\n",[33,592,593],{"class":35,"line":43},[33,594,595],{"class":39},"\u002F\u002F compose(f, g, h)(x) = f(g(h(x)))\n",[33,597,598,600,603,605,608,611,614,616,618,620,622,624,626,629,632,634,636,638,641,643,645,648],{"class":35,"line":49},[33,599,66],{"class":65},[33,601,602],{"class":97}," compose",[33,604,73],{"class":65},[33,606,607],{"class":76}," (",[33,609,610],{"class":65},"...",[33,612,613],{"class":104},"fns",[33,615,269],{"class":76},[33,617,272],{"class":65},[33,619,607],{"class":76},[33,621,105],{"class":104},[33,623,269],{"class":76},[33,625,272],{"class":65},[33,627,628],{"class":76}," fns.",[33,630,631],{"class":97},"reduceRight",[33,633,259],{"class":76},[33,635,262],{"class":104},[33,637,83],{"class":76},[33,639,640],{"class":104},"fn",[33,642,269],{"class":76},[33,644,272],{"class":65},[33,646,647],{"class":97}," fn",[33,649,650],{"class":76},"(acc), x);\n",[33,652,653],{"class":35,"line":56},[33,654,53],{"emptyLinePlaceholder":52},[33,656,657,659,662,664,667,669,671,673],{"class":35,"line":62},[33,658,66],{"class":65},[33,660,661],{"class":97}," square",[33,663,73],{"class":65},[33,665,666],{"class":104}," x",[33,668,108],{"class":65},[33,670,111],{"class":76},[33,672,114],{"class":65},[33,674,675],{"class":76}," x;\n",[33,677,678,680,683,685,687,689,691,693,696],{"class":35,"line":126},[33,679,66],{"class":65},[33,681,682],{"class":97}," addOne",[33,684,73],{"class":65},[33,686,666],{"class":104},[33,688,108],{"class":65},[33,690,111],{"class":76},[33,692,278],{"class":65},[33,694,695],{"class":69}," 1",[33,697,698],{"class":76},";\n",[33,700,701,703,706,708,710,712,714,716,718],{"class":35,"line":132},[33,702,66],{"class":65},[33,704,705],{"class":97}," double",[33,707,73],{"class":65},[33,709,666],{"class":104},[33,711,108],{"class":65},[33,713,111],{"class":76},[33,715,114],{"class":65},[33,717,117],{"class":69},[33,719,698],{"class":76},[33,721,722],{"class":35,"line":138},[33,723,53],{"emptyLinePlaceholder":52},[33,725,726,728,731,733,735],{"class":35,"line":143},[33,727,66],{"class":65},[33,729,730],{"class":69}," transform",[33,732,73],{"class":65},[33,734,602],{"class":97},[33,736,737],{"class":76},"(double, addOne, square);\n",[33,739,740],{"class":35,"line":149},[33,741,742],{"class":39},"\u002F\u002F Applied right-to-left: square(3)=9 → addOne(9)=10 → double(10)=20\n",[33,744,745,748,751,753,756,758,760,763],{"class":35,"line":205},[33,746,747],{"class":76},"console.",[33,749,750],{"class":97},"log",[33,752,101],{"class":76},[33,754,755],{"class":97},"transform",[33,757,101],{"class":76},[33,759,91],{"class":69},[33,761,762],{"class":76},"));  ",[33,764,765],{"class":39},"\u002F\u002F 20\n",[33,767,768],{"class":35,"line":211},[33,769,53],{"emptyLinePlaceholder":52},[33,771,772],{"class":35,"line":217},[33,773,774],{"class":39},"\u002F\u002F ── pipe: left-to-right composition (more intuitive reading order) ──\n",[33,776,777],{"class":35,"line":222},[33,778,779],{"class":39},"\u002F\u002F pipe(f, g, h)(x) = h(g(f(x)))\n",[33,781,782,784,787,789,791,793,795,797,799,801,803,805,807,809,811,813,815,817,819,821,823,825],{"class":35,"line":228},[33,783,66],{"class":65},[33,785,786],{"class":97}," pipe",[33,788,73],{"class":65},[33,790,607],{"class":76},[33,792,610],{"class":65},[33,794,613],{"class":104},[33,796,269],{"class":76},[33,798,272],{"class":65},[33,800,607],{"class":76},[33,802,105],{"class":104},[33,804,269],{"class":76},[33,806,272],{"class":65},[33,808,628],{"class":76},[33,810,256],{"class":97},[33,812,259],{"class":76},[33,814,262],{"class":104},[33,816,83],{"class":76},[33,818,640],{"class":104},[33,820,269],{"class":76},[33,822,272],{"class":65},[33,824,647],{"class":97},[33,826,650],{"class":76},[33,828,829],{"class":35,"line":292},[33,830,53],{"emptyLinePlaceholder":52},[33,832,833,835,838,840,842],{"class":35,"line":298},[33,834,66],{"class":65},[33,836,837],{"class":69}," transformPipe",[33,839,73],{"class":65},[33,841,786],{"class":97},[33,843,844],{"class":76},"(square, addOne, double);\n",[33,846,847],{"class":35,"line":304},[33,848,849],{"class":39},"\u002F\u002F Applied left-to-right: square(3)=9 → addOne(9)=10 → double(10)=20\n",[33,851,852,854,856,858,861,863,865,867],{"class":35,"line":310},[33,853,747],{"class":76},[33,855,750],{"class":97},[33,857,101],{"class":76},[33,859,860],{"class":97},"transformPipe",[33,862,101],{"class":76},[33,864,91],{"class":69},[33,866,762],{"class":76},[33,868,869],{"class":39},"\u002F\u002F 20 (same result, different order)\n",[33,871,872],{"class":35,"line":315},[33,873,53],{"emptyLinePlaceholder":52},[33,875,876],{"class":35,"line":321},[33,877,878],{"class":39},"\u002F\u002F ── Async pipe (each function is async) ──\n",[33,880,881,883,886,888,890,892,894,896,898,900,902,904],{"class":35,"line":360},[33,882,66],{"class":65},[33,884,885],{"class":97}," pipeAsync",[33,887,73],{"class":65},[33,889,607],{"class":76},[33,891,610],{"class":65},[33,893,613],{"class":104},[33,895,269],{"class":76},[33,897,272],{"class":65},[33,899,607],{"class":76},[33,901,105],{"class":104},[33,903,269],{"class":76},[33,905,906],{"class":65},"=>\n",[33,908,909,912,914,916,919,921,923,925,927,929,931,933,935,938],{"class":35,"line":389},[33,910,911],{"class":76},"    fns.",[33,913,256],{"class":97},[33,915,101],{"class":76},[33,917,918],{"class":65},"async",[33,920,607],{"class":76},[33,922,262],{"class":104},[33,924,83],{"class":76},[33,926,640],{"class":104},[33,928,269],{"class":76},[33,930,272],{"class":65},[33,932,647],{"class":97},[33,934,101],{"class":76},[33,936,937],{"class":65},"await",[33,939,940],{"class":76}," acc), x);\n",[33,942,943],{"class":35,"line":412},[33,944,53],{"emptyLinePlaceholder":52},[33,946,947,949,952,954,956],{"class":35,"line":449},[33,948,66],{"class":65},[33,950,951],{"class":69}," asyncPipeline",[33,953,73],{"class":65},[33,955,885],{"class":97},[33,957,958],{"class":76},"(\n",[33,960,961,964,966,968,970,972,974,977],{"class":35,"line":454},[33,962,963],{"class":65},"    async",[33,965,666],{"class":104},[33,967,108],{"class":65},[33,969,111],{"class":76},[33,971,278],{"class":65},[33,973,695],{"class":69},[33,975,976],{"class":76},",     ",[33,978,979],{"class":39},"\u002F\u002F 5 → 6\n",[33,981,982,984,986,988,990,992,994,996],{"class":35,"line":460},[33,983,963],{"class":65},[33,985,666],{"class":104},[33,987,108],{"class":65},[33,989,111],{"class":76},[33,991,114],{"class":65},[33,993,117],{"class":69},[33,995,976],{"class":76},[33,997,998],{"class":39},"\u002F\u002F 6 → 12\n",[33,1000,1001,1003,1005,1007,1009,1012,1015,1017],{"class":35,"line":466},[33,1002,963],{"class":65},[33,1004,666],{"class":104},[33,1006,108],{"class":65},[33,1008,111],{"class":76},[33,1010,1011],{"class":65},"-",[33,1013,1014],{"class":69}," 3",[33,1016,976],{"class":76},[33,1018,1019],{"class":39},"\u002F\u002F 12 → 9\n",[33,1021,1022],{"class":35,"line":519},[33,1023,1024],{"class":76},");\n",[33,1026,1027,1030,1032,1034,1037,1040,1043],{"class":35,"line":555},[33,1028,1029],{"class":97},"asyncPipeline",[33,1031,101],{"class":76},[33,1033,349],{"class":69},[33,1035,1036],{"class":76},").",[33,1038,1039],{"class":97},"then",[33,1041,1042],{"class":76},"(console.log);  ",[33,1044,1045],{"class":39},"\u002F\u002F 9\n",[33,1047,1048],{"class":35,"line":564},[33,1049,53],{"emptyLinePlaceholder":52},[33,1051,1053],{"class":35,"line":1052},32,[33,1054,1055],{"class":39},"\u002F\u002F ── Compose with multiple arguments ──\n",[33,1057,1059,1061,1064,1066,1068,1070,1072,1074,1076,1078,1080,1082,1085,1087,1090,1092,1094,1096,1098,1101,1103,1105,1108,1110,1112,1114,1116],{"class":35,"line":1058},33,[33,1060,66],{"class":65},[33,1062,1063],{"class":97}," composeMulti",[33,1065,73],{"class":65},[33,1067,607],{"class":76},[33,1069,610],{"class":65},[33,1071,613],{"class":104},[33,1073,269],{"class":76},[33,1075,272],{"class":65},[33,1077,628],{"class":76},[33,1079,631],{"class":97},[33,1081,259],{"class":76},[33,1083,1084],{"class":104},"f",[33,1086,83],{"class":76},[33,1088,1089],{"class":104},"g",[33,1091,269],{"class":76},[33,1093,272],{"class":65},[33,1095,607],{"class":76},[33,1097,610],{"class":65},[33,1099,1100],{"class":104},"args",[33,1102,269],{"class":76},[33,1104,272],{"class":65},[33,1106,1107],{"class":97}," f",[33,1109,101],{"class":76},[33,1111,1089],{"class":97},[33,1113,101],{"class":76},[33,1115,610],{"class":65},[33,1117,1118],{"class":76},"args)));\n",[33,1120,1122,1124,1127,1129,1131],{"class":35,"line":1121},34,[33,1123,66],{"class":65},[33,1125,1126],{"class":69}," addAndMultiply",[33,1128,73],{"class":65},[33,1130,1063],{"class":97},[33,1132,958],{"class":76},[33,1134,1136,1139,1141,1143,1145,1147,1150],{"class":35,"line":1135},35,[33,1137,1138],{"class":104},"    x",[33,1140,108],{"class":65},[33,1142,111],{"class":76},[33,1144,114],{"class":65},[33,1146,117],{"class":69},[33,1148,1149],{"class":76},",           ",[33,1151,1152],{"class":39},"\u002F\u002F multiply by 2\n",[33,1154,1156,1159,1161,1163,1165,1167,1169,1171,1173,1176],{"class":35,"line":1155},36,[33,1157,1158],{"class":76},"    (",[33,1160,421],{"class":104},[33,1162,83],{"class":76},[33,1164,426],{"class":104},[33,1166,269],{"class":76},[33,1168,272],{"class":65},[33,1170,433],{"class":76},[33,1172,278],{"class":65},[33,1174,1175],{"class":76}," b       ",[33,1177,1178],{"class":39},"\u002F\u002F add two numbers\n",[33,1180,1182],{"class":35,"line":1181},37,[33,1183,1024],{"class":76},[33,1185,1187,1190,1192,1194,1196,1198,1200],{"class":35,"line":1186},38,[33,1188,1189],{"class":97},"addAndMultiply",[33,1191,101],{"class":76},[33,1193,91],{"class":69},[33,1195,83],{"class":76},[33,1197,173],{"class":69},[33,1199,120],{"class":76},[33,1201,1202],{"class":39},"\u002F\u002F (3+4)*2 = 14\n",[15,1204,1206],{"id":1205},"currying-and-partial-application","Currying and Partial Application",[20,1208,1209],{"language":22},[24,1210,1212],{"className":26,"code":1211,"language":22,"meta":28,"style":28},"\u002F\u002F ── Currying: transform f(a, b, c) into f(a)(b)(c) — one arg at a time ──\nconst curry = (fn) => {\n    return function curried(...args) {\n        if (args.length >= fn.length) {  \u002F\u002F fn.length = number of params\n            return fn.apply(this, args);  \u002F\u002F enough args → call\n        }\n        return (...more) => curried(...args, ...more);  \u002F\u002F not enough → return a new function\n    };\n};\n\nconst add = curry((a, b, c) => a + b + c);\nadd(1)(2)(3);    \u002F\u002F 6 (fully curried — one arg at a time)\nadd(1, 2)(3);    \u002F\u002F 6 (partial application — first two, then last)\nadd(1, 2, 3);   \u002F\u002F 6 (all at once — same as calling the original)\n\n\u002F\u002F ── Currying for reusable partial functions ──\nconst log = curry((level, message) => console.log(`[${level}] ${message}`));\nconst logInfo = log(\"INFO\");    \u002F\u002F partial: level fixed to \"INFO\"\nconst logError = log(\"ERROR\");  \u002F\u002F partial: level fixed to \"ERROR\"\nlogInfo(\"started\");   \u002F\u002F [INFO] started\nlogError(\"crashed\");  \u002F\u002F [ERROR] crashed\n\n\u002F\u002F ── Currying for filter predicates ──\nconst matches = curry((prop, value, obj) => obj[prop] === value);\nconst findByName = matches(\"name\");\nconst findAlice = findByName(\"Alice\");\nconst users = [{ name: \"Alice\" }, { name: \"Bob\" }];\nusers.filter(findAlice);  \u002F\u002F [{ name: \"Alice\" }]\n\n\u002F\u002F ── Partial application: pre-fill some args (not full currying) ──\nconst partial = (fn, ...preset) => (...rest) => fn(...preset, ...rest);\nconst add10 = partial((a, b) => a + b, 10);\nadd10(5);  \u002F\u002F 15\n\n\u002F\u002F ── Bind as partial application ──\nconst multiply = (a, b) => a * b;\nconst double = multiply.bind(null, 2);  \u002F\u002F first arg pre-filled with 2\ndouble(5);  \u002F\u002F 10\n",[30,1213,1214,1219,1238,1257,1282,1303,1308,1341,1346,1351,1355,1395,1419,1440,1461,1465,1470,1519,1540,1561,1576,1591,1595,1600,1639,1657,1675,1698,1711,1715,1720,1769,1803,1817,1821,1826,1854,1882],{"__ignoreMap":28},[33,1215,1216],{"class":35,"line":36},[33,1217,1218],{"class":39},"\u002F\u002F ── Currying: transform f(a, b, c) into f(a)(b)(c) — one arg at a time ──\n",[33,1220,1221,1223,1226,1228,1230,1232,1234,1236],{"class":35,"line":43},[33,1222,66],{"class":65},[33,1224,1225],{"class":97}," curry",[33,1227,73],{"class":65},[33,1229,607],{"class":76},[33,1231,640],{"class":104},[33,1233,269],{"class":76},[33,1235,272],{"class":65},[33,1237,516],{"class":76},[33,1239,1240,1242,1245,1248,1250,1252,1254],{"class":35,"line":49},[33,1241,558],{"class":65},[33,1243,1244],{"class":65}," function",[33,1246,1247],{"class":97}," curried",[33,1249,101],{"class":76},[33,1251,610],{"class":65},[33,1253,1100],{"class":104},[33,1255,1256],{"class":76},") {\n",[33,1258,1259,1262,1265,1268,1271,1274,1276,1279],{"class":35,"line":56},[33,1260,1261],{"class":65},"        if",[33,1263,1264],{"class":76}," (args.",[33,1266,1267],{"class":69},"length",[33,1269,1270],{"class":65}," >=",[33,1272,1273],{"class":76}," fn.",[33,1275,1267],{"class":69},[33,1277,1278],{"class":76},") {  ",[33,1280,1281],{"class":39},"\u002F\u002F fn.length = number of params\n",[33,1283,1284,1287,1289,1292,1294,1297,1300],{"class":35,"line":62},[33,1285,1286],{"class":65},"            return",[33,1288,1273],{"class":76},[33,1290,1291],{"class":97},"apply",[33,1293,101],{"class":76},[33,1295,1296],{"class":69},"this",[33,1298,1299],{"class":76},", args);  ",[33,1301,1302],{"class":39},"\u002F\u002F enough args → call\n",[33,1304,1305],{"class":35,"line":126},[33,1306,1307],{"class":76},"        }\n",[33,1309,1310,1313,1315,1317,1320,1322,1324,1326,1328,1330,1333,1335,1338],{"class":35,"line":132},[33,1311,1312],{"class":65},"        return",[33,1314,607],{"class":76},[33,1316,610],{"class":65},[33,1318,1319],{"class":104},"more",[33,1321,269],{"class":76},[33,1323,272],{"class":65},[33,1325,1247],{"class":97},[33,1327,101],{"class":76},[33,1329,610],{"class":65},[33,1331,1332],{"class":76},"args, ",[33,1334,610],{"class":65},[33,1336,1337],{"class":76},"more);  ",[33,1339,1340],{"class":39},"\u002F\u002F not enough → return a new function\n",[33,1342,1343],{"class":35,"line":138},[33,1344,1345],{"class":76},"    };\n",[33,1347,1348],{"class":35,"line":143},[33,1349,1350],{"class":76},"};\n",[33,1352,1353],{"class":35,"line":149},[33,1354,53],{"emptyLinePlaceholder":52},[33,1356,1357,1359,1362,1364,1366,1368,1370,1372,1374,1376,1379,1381,1383,1385,1387,1390,1392],{"class":35,"line":205},[33,1358,66],{"class":65},[33,1360,1361],{"class":69}," add",[33,1363,73],{"class":65},[33,1365,1225],{"class":97},[33,1367,259],{"class":76},[33,1369,421],{"class":104},[33,1371,83],{"class":76},[33,1373,426],{"class":104},[33,1375,83],{"class":76},[33,1377,1378],{"class":104},"c",[33,1380,269],{"class":76},[33,1382,272],{"class":65},[33,1384,433],{"class":76},[33,1386,278],{"class":65},[33,1388,1389],{"class":76}," b ",[33,1391,278],{"class":65},[33,1393,1394],{"class":76}," c);\n",[33,1396,1397,1400,1402,1404,1407,1409,1411,1413,1416],{"class":35,"line":211},[33,1398,1399],{"class":97},"add",[33,1401,101],{"class":76},[33,1403,80],{"class":69},[33,1405,1406],{"class":76},")(",[33,1408,86],{"class":69},[33,1410,1406],{"class":76},[33,1412,91],{"class":69},[33,1414,1415],{"class":76},");    ",[33,1417,1418],{"class":39},"\u002F\u002F 6 (fully curried — one arg at a time)\n",[33,1420,1421,1423,1425,1427,1429,1431,1433,1435,1437],{"class":35,"line":217},[33,1422,1399],{"class":97},[33,1424,101],{"class":76},[33,1426,80],{"class":69},[33,1428,83],{"class":76},[33,1430,86],{"class":69},[33,1432,1406],{"class":76},[33,1434,91],{"class":69},[33,1436,1415],{"class":76},[33,1438,1439],{"class":39},"\u002F\u002F 6 (partial application — first two, then last)\n",[33,1441,1442,1444,1446,1448,1450,1452,1454,1456,1458],{"class":35,"line":222},[33,1443,1399],{"class":97},[33,1445,101],{"class":76},[33,1447,80],{"class":69},[33,1449,83],{"class":76},[33,1451,86],{"class":69},[33,1453,83],{"class":76},[33,1455,91],{"class":69},[33,1457,443],{"class":76},[33,1459,1460],{"class":39},"\u002F\u002F 6 (all at once — same as calling the original)\n",[33,1462,1463],{"class":35,"line":228},[33,1464,53],{"emptyLinePlaceholder":52},[33,1466,1467],{"class":35,"line":292},[33,1468,1469],{"class":39},"\u002F\u002F ── Currying for reusable partial functions ──\n",[33,1471,1472,1474,1477,1479,1481,1483,1486,1488,1491,1493,1495,1498,1500,1502,1506,1508,1511,1513,1516],{"class":35,"line":298},[33,1473,66],{"class":65},[33,1475,1476],{"class":69}," log",[33,1478,73],{"class":65},[33,1480,1225],{"class":97},[33,1482,259],{"class":76},[33,1484,1485],{"class":104},"level",[33,1487,83],{"class":76},[33,1489,1490],{"class":104},"message",[33,1492,269],{"class":76},[33,1494,272],{"class":65},[33,1496,1497],{"class":76}," console.",[33,1499,750],{"class":97},[33,1501,101],{"class":76},[33,1503,1505],{"class":1504},"sJ6F3","`[${",[33,1507,1485],{"class":76},[33,1509,1510],{"class":1504},"}] ${",[33,1512,1490],{"class":76},[33,1514,1515],{"class":1504},"}`",[33,1517,1518],{"class":76},"));\n",[33,1520,1521,1523,1526,1528,1530,1532,1535,1537],{"class":35,"line":304},[33,1522,66],{"class":65},[33,1524,1525],{"class":69}," logInfo",[33,1527,73],{"class":65},[33,1529,1476],{"class":97},[33,1531,101],{"class":76},[33,1533,1534],{"class":1504},"\"INFO\"",[33,1536,1415],{"class":76},[33,1538,1539],{"class":39},"\u002F\u002F partial: level fixed to \"INFO\"\n",[33,1541,1542,1544,1547,1549,1551,1553,1556,1558],{"class":35,"line":310},[33,1543,66],{"class":65},[33,1545,1546],{"class":69}," logError",[33,1548,73],{"class":65},[33,1550,1476],{"class":97},[33,1552,101],{"class":76},[33,1554,1555],{"class":1504},"\"ERROR\"",[33,1557,120],{"class":76},[33,1559,1560],{"class":39},"\u002F\u002F partial: level fixed to \"ERROR\"\n",[33,1562,1563,1566,1568,1571,1573],{"class":35,"line":315},[33,1564,1565],{"class":97},"logInfo",[33,1567,101],{"class":76},[33,1569,1570],{"class":1504},"\"started\"",[33,1572,443],{"class":76},[33,1574,1575],{"class":39},"\u002F\u002F [INFO] started\n",[33,1577,1578,1581,1583,1586,1588],{"class":35,"line":321},[33,1579,1580],{"class":97},"logError",[33,1582,101],{"class":76},[33,1584,1585],{"class":1504},"\"crashed\"",[33,1587,120],{"class":76},[33,1589,1590],{"class":39},"\u002F\u002F [ERROR] crashed\n",[33,1592,1593],{"class":35,"line":360},[33,1594,53],{"emptyLinePlaceholder":52},[33,1596,1597],{"class":35,"line":389},[33,1598,1599],{"class":39},"\u002F\u002F ── Currying for filter predicates ──\n",[33,1601,1602,1604,1607,1609,1611,1613,1616,1618,1621,1623,1626,1628,1630,1633,1636],{"class":35,"line":412},[33,1603,66],{"class":65},[33,1605,1606],{"class":69}," matches",[33,1608,73],{"class":65},[33,1610,1225],{"class":97},[33,1612,259],{"class":76},[33,1614,1615],{"class":104},"prop",[33,1617,83],{"class":76},[33,1619,1620],{"class":104},"value",[33,1622,83],{"class":76},[33,1624,1625],{"class":104},"obj",[33,1627,269],{"class":76},[33,1629,272],{"class":65},[33,1631,1632],{"class":76}," obj[prop] ",[33,1634,1635],{"class":65},"===",[33,1637,1638],{"class":76}," value);\n",[33,1640,1641,1643,1646,1648,1650,1652,1655],{"class":35,"line":449},[33,1642,66],{"class":65},[33,1644,1645],{"class":69}," findByName",[33,1647,73],{"class":65},[33,1649,1606],{"class":97},[33,1651,101],{"class":76},[33,1653,1654],{"class":1504},"\"name\"",[33,1656,1024],{"class":76},[33,1658,1659,1661,1664,1666,1668,1670,1673],{"class":35,"line":454},[33,1660,66],{"class":65},[33,1662,1663],{"class":69}," findAlice",[33,1665,73],{"class":65},[33,1667,1645],{"class":97},[33,1669,101],{"class":76},[33,1671,1672],{"class":1504},"\"Alice\"",[33,1674,1024],{"class":76},[33,1676,1677,1679,1682,1684,1687,1689,1692,1695],{"class":35,"line":460},[33,1678,66],{"class":65},[33,1680,1681],{"class":69}," users",[33,1683,73],{"class":65},[33,1685,1686],{"class":76}," [{ name: ",[33,1688,1672],{"class":1504},[33,1690,1691],{"class":76}," }, { name: ",[33,1693,1694],{"class":1504},"\"Bob\"",[33,1696,1697],{"class":76}," }];\n",[33,1699,1700,1703,1705,1708],{"class":35,"line":466},[33,1701,1702],{"class":76},"users.",[33,1704,178],{"class":97},[33,1706,1707],{"class":76},"(findAlice);  ",[33,1709,1710],{"class":39},"\u002F\u002F [{ name: \"Alice\" }]\n",[33,1712,1713],{"class":35,"line":519},[33,1714,53],{"emptyLinePlaceholder":52},[33,1716,1717],{"class":35,"line":555},[33,1718,1719],{"class":39},"\u002F\u002F ── Partial application: pre-fill some args (not full currying) ──\n",[33,1721,1722,1724,1727,1729,1731,1733,1735,1737,1740,1742,1744,1746,1748,1751,1753,1755,1757,1759,1761,1764,1766],{"class":35,"line":564},[33,1723,66],{"class":65},[33,1725,1726],{"class":97}," partial",[33,1728,73],{"class":65},[33,1730,607],{"class":76},[33,1732,640],{"class":104},[33,1734,83],{"class":76},[33,1736,610],{"class":65},[33,1738,1739],{"class":104},"preset",[33,1741,269],{"class":76},[33,1743,272],{"class":65},[33,1745,607],{"class":76},[33,1747,610],{"class":65},[33,1749,1750],{"class":104},"rest",[33,1752,269],{"class":76},[33,1754,272],{"class":65},[33,1756,647],{"class":97},[33,1758,101],{"class":76},[33,1760,610],{"class":65},[33,1762,1763],{"class":76},"preset, ",[33,1765,610],{"class":65},[33,1767,1768],{"class":76},"rest);\n",[33,1770,1771,1773,1776,1778,1780,1782,1784,1786,1788,1790,1792,1794,1796,1798,1801],{"class":35,"line":1052},[33,1772,66],{"class":65},[33,1774,1775],{"class":69}," add10",[33,1777,73],{"class":65},[33,1779,1726],{"class":97},[33,1781,259],{"class":76},[33,1783,421],{"class":104},[33,1785,83],{"class":76},[33,1787,426],{"class":104},[33,1789,269],{"class":76},[33,1791,272],{"class":65},[33,1793,433],{"class":76},[33,1795,278],{"class":65},[33,1797,438],{"class":76},[33,1799,1800],{"class":69},"10",[33,1802,1024],{"class":76},[33,1804,1805,1808,1810,1812,1814],{"class":35,"line":1058},[33,1806,1807],{"class":97},"add10",[33,1809,101],{"class":76},[33,1811,349],{"class":69},[33,1813,120],{"class":76},[33,1815,1816],{"class":39},"\u002F\u002F 15\n",[33,1818,1819],{"class":35,"line":1121},[33,1820,53],{"emptyLinePlaceholder":52},[33,1822,1823],{"class":35,"line":1135},[33,1824,1825],{"class":39},"\u002F\u002F ── Bind as partial application ──\n",[33,1827,1828,1830,1833,1835,1837,1839,1841,1843,1845,1847,1849,1851],{"class":35,"line":1155},[33,1829,66],{"class":65},[33,1831,1832],{"class":97}," multiply",[33,1834,73],{"class":65},[33,1836,607],{"class":76},[33,1838,421],{"class":104},[33,1840,83],{"class":76},[33,1842,426],{"class":104},[33,1844,269],{"class":76},[33,1846,272],{"class":65},[33,1848,433],{"class":76},[33,1850,114],{"class":65},[33,1852,1853],{"class":76}," b;\n",[33,1855,1856,1858,1860,1862,1865,1868,1870,1873,1875,1877,1879],{"class":35,"line":1181},[33,1857,66],{"class":65},[33,1859,705],{"class":69},[33,1861,73],{"class":65},[33,1863,1864],{"class":76}," multiply.",[33,1866,1867],{"class":97},"bind",[33,1869,101],{"class":76},[33,1871,1872],{"class":69},"null",[33,1874,83],{"class":76},[33,1876,86],{"class":69},[33,1878,120],{"class":76},[33,1880,1881],{"class":39},"\u002F\u002F first arg pre-filled with 2\n",[33,1883,1884,1887,1889,1891,1893],{"class":35,"line":1186},[33,1885,1886],{"class":97},"double",[33,1888,101],{"class":76},[33,1890,349],{"class":69},[33,1892,120],{"class":76},[33,1894,289],{"class":39},[15,1896,1898],{"id":1897},"point-free-style-tacit-programming","Point-Free Style (Tacit Programming)",[20,1900,1901],{"language":22},[24,1902,1904],{"className":26,"code":1903,"language":22,"meta":28,"style":28},"\u002F\u002F ── Point-free: define functions without mentioning the data (the \"point\") ──\n\n\u002F\u002F ❌ NOT point-free (explicit data parameter):\nconst getNames = (users) => users.map(u => u.name);\nconst getActiveUsers = (users) => users.filter(u => u.active);\nconst countActive = (users) => getActiveUsers(users).length;\n\n\u002F\u002F ✅ POINT-FREE (no explicit data — composed from small functions):\nconst prop = (key) => (obj) => obj[key];\nconst filter = (pred) => (arr) => arr.filter(pred);\nconst map = (fn) => (arr) => arr.map(fn);\nconst compose = (...fns) => fns.reduceRight((f, g) => (...args) => f(g(...args)));\n\nconst getName = prop(\"name\");\nconst isActive = prop(\"active\");\nconst getNames2 = map(getName);\nconst getActiveUsers2 = filter(isActive);\nconst getActiveNames = compose(getNames2, getActiveUsers2);\n\u002F\u002F getActiveNames(users) — no `users` parameter mentioned in the definition\n\n\u002F\u002F ── Point-free pipeline for data transformation ──\nconst parseJson = (str) => JSON.parse(str);\nconst getData = prop(\"data\");\nconst getItems = prop(\"items\");\nconst getFirst = (arr) => arr[0];\nconst getName2 = prop(\"name\");\n\nconst getFirstName = compose(\n    getName2,      \u002F\u002F get name from the first item\n    getFirst,      \u002F\u002F get first item\n    getItems,      \u002F\u002F get items from data\n    getData,       \u002F\u002F get data from response\n    parseJson,     \u002F\u002F parse the JSON string\n);\ngetFirstName('{\"data\":{\"items\":[{\"name\":\"Alice\"},{\"name\":\"Bob\"}]}}');  \u002F\u002F \"Alice\"\n",[30,1905,1906,1911,1915,1920,1953,1983,2009,2013,2018,2047,2082,2114,2170,2174,2191,2209,2223,2237,2251,2256,2260,2265,2295,2313,2331,2356,2373,2377,2390,2398,2406,2414,2422,2430,2434],{"__ignoreMap":28},[33,1907,1908],{"class":35,"line":36},[33,1909,1910],{"class":39},"\u002F\u002F ── Point-free: define functions without mentioning the data (the \"point\") ──\n",[33,1912,1913],{"class":35,"line":43},[33,1914,53],{"emptyLinePlaceholder":52},[33,1916,1917],{"class":35,"line":49},[33,1918,1919],{"class":39},"\u002F\u002F ❌ NOT point-free (explicit data parameter):\n",[33,1921,1922,1924,1927,1929,1931,1934,1936,1938,1941,1943,1945,1948,1950],{"class":35,"line":56},[33,1923,66],{"class":65},[33,1925,1926],{"class":97}," getNames",[33,1928,73],{"class":65},[33,1930,607],{"class":76},[33,1932,1933],{"class":104},"users",[33,1935,269],{"class":76},[33,1937,272],{"class":65},[33,1939,1940],{"class":76}," users.",[33,1942,98],{"class":97},[33,1944,101],{"class":76},[33,1946,1947],{"class":104},"u",[33,1949,108],{"class":65},[33,1951,1952],{"class":76}," u.name);\n",[33,1954,1955,1957,1960,1962,1964,1966,1968,1970,1972,1974,1976,1978,1980],{"class":35,"line":62},[33,1956,66],{"class":65},[33,1958,1959],{"class":97}," getActiveUsers",[33,1961,73],{"class":65},[33,1963,607],{"class":76},[33,1965,1933],{"class":104},[33,1967,269],{"class":76},[33,1969,272],{"class":65},[33,1971,1940],{"class":76},[33,1973,178],{"class":97},[33,1975,101],{"class":76},[33,1977,1947],{"class":104},[33,1979,108],{"class":65},[33,1981,1982],{"class":76}," u.active);\n",[33,1984,1985,1987,1990,1992,1994,1996,1998,2000,2002,2005,2007],{"class":35,"line":126},[33,1986,66],{"class":65},[33,1988,1989],{"class":97}," countActive",[33,1991,73],{"class":65},[33,1993,607],{"class":76},[33,1995,1933],{"class":104},[33,1997,269],{"class":76},[33,1999,272],{"class":65},[33,2001,1959],{"class":97},[33,2003,2004],{"class":76},"(users).",[33,2006,1267],{"class":69},[33,2008,698],{"class":76},[33,2010,2011],{"class":35,"line":132},[33,2012,53],{"emptyLinePlaceholder":52},[33,2014,2015],{"class":35,"line":138},[33,2016,2017],{"class":39},"\u002F\u002F ✅ POINT-FREE (no explicit data — composed from small functions):\n",[33,2019,2020,2022,2025,2027,2029,2032,2034,2036,2038,2040,2042,2044],{"class":35,"line":143},[33,2021,66],{"class":65},[33,2023,2024],{"class":97}," prop",[33,2026,73],{"class":65},[33,2028,607],{"class":76},[33,2030,2031],{"class":104},"key",[33,2033,269],{"class":76},[33,2035,272],{"class":65},[33,2037,607],{"class":76},[33,2039,1625],{"class":104},[33,2041,269],{"class":76},[33,2043,272],{"class":65},[33,2045,2046],{"class":76}," obj[key];\n",[33,2048,2049,2051,2054,2056,2058,2061,2063,2065,2067,2070,2072,2074,2077,2079],{"class":35,"line":149},[33,2050,66],{"class":65},[33,2052,2053],{"class":97}," filter",[33,2055,73],{"class":65},[33,2057,607],{"class":76},[33,2059,2060],{"class":104},"pred",[33,2062,269],{"class":76},[33,2064,272],{"class":65},[33,2066,607],{"class":76},[33,2068,2069],{"class":104},"arr",[33,2071,269],{"class":76},[33,2073,272],{"class":65},[33,2075,2076],{"class":76}," arr.",[33,2078,178],{"class":97},[33,2080,2081],{"class":76},"(pred);\n",[33,2083,2084,2086,2089,2091,2093,2095,2097,2099,2101,2103,2105,2107,2109,2111],{"class":35,"line":205},[33,2085,66],{"class":65},[33,2087,2088],{"class":97}," map",[33,2090,73],{"class":65},[33,2092,607],{"class":76},[33,2094,640],{"class":104},[33,2096,269],{"class":76},[33,2098,272],{"class":65},[33,2100,607],{"class":76},[33,2102,2069],{"class":104},[33,2104,269],{"class":76},[33,2106,272],{"class":65},[33,2108,2076],{"class":76},[33,2110,98],{"class":97},[33,2112,2113],{"class":76},"(fn);\n",[33,2115,2116,2118,2120,2122,2124,2126,2128,2130,2132,2134,2136,2138,2140,2142,2144,2146,2148,2150,2152,2154,2156,2158,2160,2162,2164,2166,2168],{"class":35,"line":211},[33,2117,66],{"class":65},[33,2119,602],{"class":97},[33,2121,73],{"class":65},[33,2123,607],{"class":76},[33,2125,610],{"class":65},[33,2127,613],{"class":104},[33,2129,269],{"class":76},[33,2131,272],{"class":65},[33,2133,628],{"class":76},[33,2135,631],{"class":97},[33,2137,259],{"class":76},[33,2139,1084],{"class":104},[33,2141,83],{"class":76},[33,2143,1089],{"class":104},[33,2145,269],{"class":76},[33,2147,272],{"class":65},[33,2149,607],{"class":76},[33,2151,610],{"class":65},[33,2153,1100],{"class":104},[33,2155,269],{"class":76},[33,2157,272],{"class":65},[33,2159,1107],{"class":97},[33,2161,101],{"class":76},[33,2163,1089],{"class":97},[33,2165,101],{"class":76},[33,2167,610],{"class":65},[33,2169,1118],{"class":76},[33,2171,2172],{"class":35,"line":217},[33,2173,53],{"emptyLinePlaceholder":52},[33,2175,2176,2178,2181,2183,2185,2187,2189],{"class":35,"line":222},[33,2177,66],{"class":65},[33,2179,2180],{"class":69}," getName",[33,2182,73],{"class":65},[33,2184,2024],{"class":97},[33,2186,101],{"class":76},[33,2188,1654],{"class":1504},[33,2190,1024],{"class":76},[33,2192,2193,2195,2198,2200,2202,2204,2207],{"class":35,"line":228},[33,2194,66],{"class":65},[33,2196,2197],{"class":69}," isActive",[33,2199,73],{"class":65},[33,2201,2024],{"class":97},[33,2203,101],{"class":76},[33,2205,2206],{"class":1504},"\"active\"",[33,2208,1024],{"class":76},[33,2210,2211,2213,2216,2218,2220],{"class":35,"line":292},[33,2212,66],{"class":65},[33,2214,2215],{"class":69}," getNames2",[33,2217,73],{"class":65},[33,2219,2088],{"class":97},[33,2221,2222],{"class":76},"(getName);\n",[33,2224,2225,2227,2230,2232,2234],{"class":35,"line":298},[33,2226,66],{"class":65},[33,2228,2229],{"class":69}," getActiveUsers2",[33,2231,73],{"class":65},[33,2233,2053],{"class":97},[33,2235,2236],{"class":76},"(isActive);\n",[33,2238,2239,2241,2244,2246,2248],{"class":35,"line":304},[33,2240,66],{"class":65},[33,2242,2243],{"class":69}," getActiveNames",[33,2245,73],{"class":65},[33,2247,602],{"class":97},[33,2249,2250],{"class":76},"(getNames2, getActiveUsers2);\n",[33,2252,2253],{"class":35,"line":310},[33,2254,2255],{"class":39},"\u002F\u002F getActiveNames(users) — no `users` parameter mentioned in the definition\n",[33,2257,2258],{"class":35,"line":315},[33,2259,53],{"emptyLinePlaceholder":52},[33,2261,2262],{"class":35,"line":321},[33,2263,2264],{"class":39},"\u002F\u002F ── Point-free pipeline for data transformation ──\n",[33,2266,2267,2269,2272,2274,2276,2279,2281,2283,2286,2289,2292],{"class":35,"line":360},[33,2268,66],{"class":65},[33,2270,2271],{"class":97}," parseJson",[33,2273,73],{"class":65},[33,2275,607],{"class":76},[33,2277,2278],{"class":104},"str",[33,2280,269],{"class":76},[33,2282,272],{"class":65},[33,2284,2285],{"class":69}," JSON",[33,2287,2288],{"class":76},".",[33,2290,2291],{"class":97},"parse",[33,2293,2294],{"class":76},"(str);\n",[33,2296,2297,2299,2302,2304,2306,2308,2311],{"class":35,"line":389},[33,2298,66],{"class":65},[33,2300,2301],{"class":69}," getData",[33,2303,73],{"class":65},[33,2305,2024],{"class":97},[33,2307,101],{"class":76},[33,2309,2310],{"class":1504},"\"data\"",[33,2312,1024],{"class":76},[33,2314,2315,2317,2320,2322,2324,2326,2329],{"class":35,"line":412},[33,2316,66],{"class":65},[33,2318,2319],{"class":69}," getItems",[33,2321,73],{"class":65},[33,2323,2024],{"class":97},[33,2325,101],{"class":76},[33,2327,2328],{"class":1504},"\"items\"",[33,2330,1024],{"class":76},[33,2332,2333,2335,2338,2340,2342,2344,2346,2348,2351,2353],{"class":35,"line":449},[33,2334,66],{"class":65},[33,2336,2337],{"class":97}," getFirst",[33,2339,73],{"class":65},[33,2341,607],{"class":76},[33,2343,2069],{"class":104},[33,2345,269],{"class":76},[33,2347,272],{"class":65},[33,2349,2350],{"class":76}," arr[",[33,2352,284],{"class":69},[33,2354,2355],{"class":76},"];\n",[33,2357,2358,2360,2363,2365,2367,2369,2371],{"class":35,"line":454},[33,2359,66],{"class":65},[33,2361,2362],{"class":69}," getName2",[33,2364,73],{"class":65},[33,2366,2024],{"class":97},[33,2368,101],{"class":76},[33,2370,1654],{"class":1504},[33,2372,1024],{"class":76},[33,2374,2375],{"class":35,"line":460},[33,2376,53],{"emptyLinePlaceholder":52},[33,2378,2379,2381,2384,2386,2388],{"class":35,"line":466},[33,2380,66],{"class":65},[33,2382,2383],{"class":69}," getFirstName",[33,2385,73],{"class":65},[33,2387,602],{"class":97},[33,2389,958],{"class":76},[33,2391,2392,2395],{"class":35,"line":519},[33,2393,2394],{"class":76},"    getName2,      ",[33,2396,2397],{"class":39},"\u002F\u002F get name from the first item\n",[33,2399,2400,2403],{"class":35,"line":555},[33,2401,2402],{"class":76},"    getFirst,      ",[33,2404,2405],{"class":39},"\u002F\u002F get first item\n",[33,2407,2408,2411],{"class":35,"line":564},[33,2409,2410],{"class":76},"    getItems,      ",[33,2412,2413],{"class":39},"\u002F\u002F get items from data\n",[33,2415,2416,2419],{"class":35,"line":1052},[33,2417,2418],{"class":76},"    getData,       ",[33,2420,2421],{"class":39},"\u002F\u002F get data from response\n",[33,2423,2424,2427],{"class":35,"line":1058},[33,2425,2426],{"class":76},"    parseJson,     ",[33,2428,2429],{"class":39},"\u002F\u002F parse the JSON string\n",[33,2431,2432],{"class":35,"line":1121},[33,2433,1024],{"class":76},[33,2435,2436,2439,2441,2444,2446],{"class":35,"line":1135},[33,2437,2438],{"class":97},"getFirstName",[33,2440,101],{"class":76},[33,2442,2443],{"class":1504},"'{\"data\":{\"items\":[{\"name\":\"Alice\"},{\"name\":\"Bob\"}]}}'",[33,2445,120],{"class":76},[33,2447,2448],{"class":39},"\u002F\u002F \"Alice\"\n",[15,2450,2452],{"id":2451},"production-pattern-validator-pipeline","Production Pattern: Validator Pipeline",[20,2454,2455],{"language":22},[24,2456,2458],{"className":26,"code":2457,"language":22,"meta":28,"style":28},"\u002F\u002F ── Composable validators using higher-order functions ──\nconst Validator = {\n    \u002F\u002F Primitive validators (return error message or null)\n    required: (value) => value == null ? \"required\" : null,\n    minLength: (n) => (value) => value.length \u003C n ? `min ${n} chars` : null,\n    maxLength: (n) => (value) => value.length > n ? `max ${n} chars` : null,\n    matches: (regex) => (value) => !regex.test(value) ? \"invalid format\" : null,\n    isEmail: (value) => !\u002F^[^@]+@[^@]+$\u002F.test(value) ? \"invalid email\" : null,\n    isNumber: (value) => typeof value !== \"number\" ? \"must be a number\" : null,\n    inRange: (min, max) => (value) => value \u003C min || value > max ? `must be ${min}-${max}` : null,\n\n    \u002F\u002F Compose validators: run all, collect all errors\n    all: (...validators) => (value) =>\n        validators\n            .map(v => v(value))\n            .filter(Boolean),  \u002F\u002F returns array of error messages (empty = valid)\n\n    \u002F\u002F Run validators: first error wins (short-circuit)\n    first: (...validators) => (value) =>\n        validators.reduce((err, v) => err || v(value), null),\n};\n\n\u002F\u002F ── Usage ──\nconst validateUsername = Validator.all(\n    Validator.required,\n    Validator.minLength(3),\n    Validator.maxLength(20),\n);\n\nconst validateEmail = Validator.all(\n    Validator.required,\n    Validator.isEmail,\n);\n\nconst validateAge = Validator.first(\n    Validator.required,\n    Validator.isNumber,\n    Validator.inRange(0, 150),\n);\n\nconsole.log(validateUsername(\"ab\"));   \u002F\u002F [\"min 3 chars\"]\nconsole.log(validateUsername(\"alice\")); \u002F\u002F [] (no errors)\nconsole.log(validateEmail(\"test@test.com\")); \u002F\u002F []\nconsole.log(validateEmail(\"invalid\")); \u002F\u002F [\"invalid email\"]\nconsole.log(validateAge(25));  \u002F\u002F null (valid)\nconsole.log(validateAge(200)); \u002F\u002F \"must be 0-150\"\n",[30,2459,2460,2465,2476,2481,2518,2568,2613,2658,2721,2756,2822,2826,2831,2855,2860,2880,2892,2896,2901,2924,2959,2963,2967,2972,2989,2994,3008,3022,3026,3030,3045,3049,3054,3058,3062,3078,3082,3087,3105,3110,3115,3138,3160,3182,3203,3225],{"__ignoreMap":28},[33,2461,2462],{"class":35,"line":36},[33,2463,2464],{"class":39},"\u002F\u002F ── Composable validators using higher-order functions ──\n",[33,2466,2467,2469,2472,2474],{"class":35,"line":43},[33,2468,66],{"class":65},[33,2470,2471],{"class":69}," Validator",[33,2473,73],{"class":65},[33,2475,516],{"class":76},[33,2477,2478],{"class":35,"line":49},[33,2479,2480],{"class":39},"    \u002F\u002F Primitive validators (return error message or null)\n",[33,2482,2483,2486,2489,2491,2493,2495,2498,2501,2504,2507,2510,2513,2515],{"class":35,"line":56},[33,2484,2485],{"class":97},"    required",[33,2487,2488],{"class":76},": (",[33,2490,1620],{"class":104},[33,2492,269],{"class":76},[33,2494,272],{"class":65},[33,2496,2497],{"class":76}," value ",[33,2499,2500],{"class":65},"==",[33,2502,2503],{"class":69}," null",[33,2505,2506],{"class":65}," ?",[33,2508,2509],{"class":1504}," \"required\"",[33,2511,2512],{"class":65}," :",[33,2514,2503],{"class":69},[33,2516,2517],{"class":76},",\n",[33,2519,2520,2523,2525,2528,2530,2532,2534,2536,2538,2540,2543,2545,2548,2551,2554,2557,2559,2562,2564,2566],{"class":35,"line":62},[33,2521,2522],{"class":97},"    minLength",[33,2524,2488],{"class":76},[33,2526,2527],{"class":104},"n",[33,2529,269],{"class":76},[33,2531,272],{"class":65},[33,2533,607],{"class":76},[33,2535,1620],{"class":104},[33,2537,269],{"class":76},[33,2539,272],{"class":65},[33,2541,2542],{"class":76}," value.",[33,2544,1267],{"class":69},[33,2546,2547],{"class":65}," \u003C",[33,2549,2550],{"class":76}," n ",[33,2552,2553],{"class":65},"?",[33,2555,2556],{"class":1504}," `min ${",[33,2558,2527],{"class":76},[33,2560,2561],{"class":1504},"} chars`",[33,2563,2512],{"class":65},[33,2565,2503],{"class":69},[33,2567,2517],{"class":76},[33,2569,2570,2573,2575,2577,2579,2581,2583,2585,2587,2589,2591,2593,2596,2598,2600,2603,2605,2607,2609,2611],{"class":35,"line":126},[33,2571,2572],{"class":97},"    maxLength",[33,2574,2488],{"class":76},[33,2576,2527],{"class":104},[33,2578,269],{"class":76},[33,2580,272],{"class":65},[33,2582,607],{"class":76},[33,2584,1620],{"class":104},[33,2586,269],{"class":76},[33,2588,272],{"class":65},[33,2590,2542],{"class":76},[33,2592,1267],{"class":69},[33,2594,2595],{"class":65}," >",[33,2597,2550],{"class":76},[33,2599,2553],{"class":65},[33,2601,2602],{"class":1504}," `max ${",[33,2604,2527],{"class":76},[33,2606,2561],{"class":1504},[33,2608,2512],{"class":65},[33,2610,2503],{"class":69},[33,2612,2517],{"class":76},[33,2614,2615,2618,2620,2623,2625,2627,2629,2631,2633,2635,2638,2641,2644,2647,2649,2652,2654,2656],{"class":35,"line":132},[33,2616,2617],{"class":97},"    matches",[33,2619,2488],{"class":76},[33,2621,2622],{"class":104},"regex",[33,2624,269],{"class":76},[33,2626,272],{"class":65},[33,2628,607],{"class":76},[33,2630,1620],{"class":104},[33,2632,269],{"class":76},[33,2634,272],{"class":65},[33,2636,2637],{"class":65}," !",[33,2639,2640],{"class":76},"regex.",[33,2642,2643],{"class":97},"test",[33,2645,2646],{"class":76},"(value) ",[33,2648,2553],{"class":65},[33,2650,2651],{"class":1504}," \"invalid format\"",[33,2653,2512],{"class":65},[33,2655,2503],{"class":69},[33,2657,2517],{"class":76},[33,2659,2660,2663,2665,2667,2669,2671,2673,2676,2679,2682,2684,2687,2689,2693,2695,2697,2699,2702,2704,2706,2708,2710,2712,2715,2717,2719],{"class":35,"line":138},[33,2661,2662],{"class":97},"    isEmail",[33,2664,2488],{"class":76},[33,2666,1620],{"class":104},[33,2668,269],{"class":76},[33,2670,272],{"class":65},[33,2672,2637],{"class":65},[33,2674,2675],{"class":1504},"\u002F",[33,2677,2678],{"class":65},"^",[33,2680,2681],{"class":69},"[",[33,2683,2678],{"class":65},[33,2685,2686],{"class":69},"@]",[33,2688,278],{"class":65},[33,2690,2692],{"class":2691},"svAP2","@",[33,2694,2681],{"class":69},[33,2696,2678],{"class":65},[33,2698,2686],{"class":69},[33,2700,2701],{"class":65},"+$",[33,2703,2675],{"class":1504},[33,2705,2288],{"class":76},[33,2707,2643],{"class":97},[33,2709,2646],{"class":76},[33,2711,2553],{"class":65},[33,2713,2714],{"class":1504}," \"invalid email\"",[33,2716,2512],{"class":65},[33,2718,2503],{"class":69},[33,2720,2517],{"class":76},[33,2722,2723,2726,2728,2730,2732,2734,2737,2739,2742,2745,2747,2750,2752,2754],{"class":35,"line":143},[33,2724,2725],{"class":97},"    isNumber",[33,2727,2488],{"class":76},[33,2729,1620],{"class":104},[33,2731,269],{"class":76},[33,2733,272],{"class":65},[33,2735,2736],{"class":65}," typeof",[33,2738,2497],{"class":76},[33,2740,2741],{"class":65},"!==",[33,2743,2744],{"class":1504}," \"number\"",[33,2746,2506],{"class":65},[33,2748,2749],{"class":1504}," \"must be a number\"",[33,2751,2512],{"class":65},[33,2753,2503],{"class":69},[33,2755,2517],{"class":76},[33,2757,2758,2761,2763,2766,2768,2771,2773,2775,2777,2779,2781,2783,2785,2788,2791,2794,2796,2799,2802,2804,2807,2809,2812,2814,2816,2818,2820],{"class":35,"line":149},[33,2759,2760],{"class":97},"    inRange",[33,2762,2488],{"class":76},[33,2764,2765],{"class":104},"min",[33,2767,83],{"class":76},[33,2769,2770],{"class":104},"max",[33,2772,269],{"class":76},[33,2774,272],{"class":65},[33,2776,607],{"class":76},[33,2778,1620],{"class":104},[33,2780,269],{"class":76},[33,2782,272],{"class":65},[33,2784,2497],{"class":76},[33,2786,2787],{"class":65},"\u003C",[33,2789,2790],{"class":76}," min ",[33,2792,2793],{"class":65},"||",[33,2795,2497],{"class":76},[33,2797,2798],{"class":65},">",[33,2800,2801],{"class":76}," max ",[33,2803,2553],{"class":65},[33,2805,2806],{"class":1504}," `must be ${",[33,2808,2765],{"class":76},[33,2810,2811],{"class":1504},"}-${",[33,2813,2770],{"class":76},[33,2815,1515],{"class":1504},[33,2817,2512],{"class":65},[33,2819,2503],{"class":69},[33,2821,2517],{"class":76},[33,2823,2824],{"class":35,"line":205},[33,2825,53],{"emptyLinePlaceholder":52},[33,2827,2828],{"class":35,"line":211},[33,2829,2830],{"class":39},"    \u002F\u002F Compose validators: run all, collect all errors\n",[33,2832,2833,2836,2838,2840,2843,2845,2847,2849,2851,2853],{"class":35,"line":217},[33,2834,2835],{"class":97},"    all",[33,2837,2488],{"class":76},[33,2839,610],{"class":65},[33,2841,2842],{"class":104},"validators",[33,2844,269],{"class":76},[33,2846,272],{"class":65},[33,2848,607],{"class":76},[33,2850,1620],{"class":104},[33,2852,269],{"class":76},[33,2854,906],{"class":65},[33,2856,2857],{"class":35,"line":222},[33,2858,2859],{"class":76},"        validators\n",[33,2861,2862,2865,2867,2869,2872,2874,2877],{"class":35,"line":228},[33,2863,2864],{"class":76},"            .",[33,2866,98],{"class":97},[33,2868,101],{"class":76},[33,2870,2871],{"class":104},"v",[33,2873,108],{"class":65},[33,2875,2876],{"class":97}," v",[33,2878,2879],{"class":76},"(value))\n",[33,2881,2882,2884,2886,2889],{"class":35,"line":292},[33,2883,2864],{"class":76},[33,2885,178],{"class":97},[33,2887,2888],{"class":76},"(Boolean),  ",[33,2890,2891],{"class":39},"\u002F\u002F returns array of error messages (empty = valid)\n",[33,2893,2894],{"class":35,"line":298},[33,2895,53],{"emptyLinePlaceholder":52},[33,2897,2898],{"class":35,"line":304},[33,2899,2900],{"class":39},"    \u002F\u002F Run validators: first error wins (short-circuit)\n",[33,2902,2903,2906,2908,2910,2912,2914,2916,2918,2920,2922],{"class":35,"line":310},[33,2904,2905],{"class":97},"    first",[33,2907,2488],{"class":76},[33,2909,610],{"class":65},[33,2911,2842],{"class":104},[33,2913,269],{"class":76},[33,2915,272],{"class":65},[33,2917,607],{"class":76},[33,2919,1620],{"class":104},[33,2921,269],{"class":76},[33,2923,906],{"class":65},[33,2925,2926,2929,2931,2933,2936,2938,2940,2942,2944,2947,2949,2951,2954,2956],{"class":35,"line":315},[33,2927,2928],{"class":76},"        validators.",[33,2930,256],{"class":97},[33,2932,259],{"class":76},[33,2934,2935],{"class":104},"err",[33,2937,83],{"class":76},[33,2939,2871],{"class":104},[33,2941,269],{"class":76},[33,2943,272],{"class":65},[33,2945,2946],{"class":76}," err ",[33,2948,2793],{"class":65},[33,2950,2876],{"class":97},[33,2952,2953],{"class":76},"(value), ",[33,2955,1872],{"class":69},[33,2957,2958],{"class":76},"),\n",[33,2960,2961],{"class":35,"line":321},[33,2962,1350],{"class":76},[33,2964,2965],{"class":35,"line":360},[33,2966,53],{"emptyLinePlaceholder":52},[33,2968,2969],{"class":35,"line":389},[33,2970,2971],{"class":39},"\u002F\u002F ── Usage ──\n",[33,2973,2974,2976,2979,2981,2984,2987],{"class":35,"line":412},[33,2975,66],{"class":65},[33,2977,2978],{"class":69}," validateUsername",[33,2980,73],{"class":65},[33,2982,2983],{"class":76}," Validator.",[33,2985,2986],{"class":97},"all",[33,2988,958],{"class":76},[33,2990,2991],{"class":35,"line":449},[33,2992,2993],{"class":76},"    Validator.required,\n",[33,2995,2996,2999,3002,3004,3006],{"class":35,"line":454},[33,2997,2998],{"class":76},"    Validator.",[33,3000,3001],{"class":97},"minLength",[33,3003,101],{"class":76},[33,3005,91],{"class":69},[33,3007,2958],{"class":76},[33,3009,3010,3012,3015,3017,3020],{"class":35,"line":460},[33,3011,2998],{"class":76},[33,3013,3014],{"class":97},"maxLength",[33,3016,101],{"class":76},[33,3018,3019],{"class":69},"20",[33,3021,2958],{"class":76},[33,3023,3024],{"class":35,"line":466},[33,3025,1024],{"class":76},[33,3027,3028],{"class":35,"line":519},[33,3029,53],{"emptyLinePlaceholder":52},[33,3031,3032,3034,3037,3039,3041,3043],{"class":35,"line":555},[33,3033,66],{"class":65},[33,3035,3036],{"class":69}," validateEmail",[33,3038,73],{"class":65},[33,3040,2983],{"class":76},[33,3042,2986],{"class":97},[33,3044,958],{"class":76},[33,3046,3047],{"class":35,"line":564},[33,3048,2993],{"class":76},[33,3050,3051],{"class":35,"line":1052},[33,3052,3053],{"class":76},"    Validator.isEmail,\n",[33,3055,3056],{"class":35,"line":1058},[33,3057,1024],{"class":76},[33,3059,3060],{"class":35,"line":1121},[33,3061,53],{"emptyLinePlaceholder":52},[33,3063,3064,3066,3069,3071,3073,3076],{"class":35,"line":1135},[33,3065,66],{"class":65},[33,3067,3068],{"class":69}," validateAge",[33,3070,73],{"class":65},[33,3072,2983],{"class":76},[33,3074,3075],{"class":97},"first",[33,3077,958],{"class":76},[33,3079,3080],{"class":35,"line":1155},[33,3081,2993],{"class":76},[33,3083,3084],{"class":35,"line":1181},[33,3085,3086],{"class":76},"    Validator.isNumber,\n",[33,3088,3089,3091,3094,3096,3098,3100,3103],{"class":35,"line":1186},[33,3090,2998],{"class":76},[33,3092,3093],{"class":97},"inRange",[33,3095,101],{"class":76},[33,3097,284],{"class":69},[33,3099,83],{"class":76},[33,3101,3102],{"class":69},"150",[33,3104,2958],{"class":76},[33,3106,3108],{"class":35,"line":3107},39,[33,3109,1024],{"class":76},[33,3111,3113],{"class":35,"line":3112},40,[33,3114,53],{"emptyLinePlaceholder":52},[33,3116,3118,3120,3122,3124,3127,3129,3132,3135],{"class":35,"line":3117},41,[33,3119,747],{"class":76},[33,3121,750],{"class":97},[33,3123,101],{"class":76},[33,3125,3126],{"class":97},"validateUsername",[33,3128,101],{"class":76},[33,3130,3131],{"class":1504},"\"ab\"",[33,3133,3134],{"class":76},"));   ",[33,3136,3137],{"class":39},"\u002F\u002F [\"min 3 chars\"]\n",[33,3139,3141,3143,3145,3147,3149,3151,3154,3157],{"class":35,"line":3140},42,[33,3142,747],{"class":76},[33,3144,750],{"class":97},[33,3146,101],{"class":76},[33,3148,3126],{"class":97},[33,3150,101],{"class":76},[33,3152,3153],{"class":1504},"\"alice\"",[33,3155,3156],{"class":76},")); ",[33,3158,3159],{"class":39},"\u002F\u002F [] (no errors)\n",[33,3161,3163,3165,3167,3169,3172,3174,3177,3179],{"class":35,"line":3162},43,[33,3164,747],{"class":76},[33,3166,750],{"class":97},[33,3168,101],{"class":76},[33,3170,3171],{"class":97},"validateEmail",[33,3173,101],{"class":76},[33,3175,3176],{"class":1504},"\"test@test.com\"",[33,3178,3156],{"class":76},[33,3180,3181],{"class":39},"\u002F\u002F []\n",[33,3183,3185,3187,3189,3191,3193,3195,3198,3200],{"class":35,"line":3184},44,[33,3186,747],{"class":76},[33,3188,750],{"class":97},[33,3190,101],{"class":76},[33,3192,3171],{"class":97},[33,3194,101],{"class":76},[33,3196,3197],{"class":1504},"\"invalid\"",[33,3199,3156],{"class":76},[33,3201,3202],{"class":39},"\u002F\u002F [\"invalid email\"]\n",[33,3204,3206,3208,3210,3212,3215,3217,3220,3222],{"class":35,"line":3205},45,[33,3207,747],{"class":76},[33,3209,750],{"class":97},[33,3211,101],{"class":76},[33,3213,3214],{"class":97},"validateAge",[33,3216,101],{"class":76},[33,3218,3219],{"class":69},"25",[33,3221,762],{"class":76},[33,3223,3224],{"class":39},"\u002F\u002F null (valid)\n",[33,3226,3228,3230,3232,3234,3236,3238,3241,3243],{"class":35,"line":3227},46,[33,3229,747],{"class":76},[33,3231,750],{"class":97},[33,3233,101],{"class":76},[33,3235,3214],{"class":97},[33,3237,101],{"class":76},[33,3239,3240],{"class":69},"200",[33,3242,3156],{"class":76},[33,3244,3245],{"class":39},"\u002F\u002F \"must be 0-150\"\n",[15,3247,3249],{"id":3248},"tips-tricks","💡 Tips & Tricks",[20,3251,3252],{"language":22},[24,3253,3255],{"className":26,"code":3254,"language":22,"meta":28,"style":28},"\u002F\u002F ── `flow` (pipe alias) for left-to-right readability ──\nconst flow = (...fns) => (x) => fns.reduce((v, f) => f(v), x);\n\n\u002F\u002F ── `tap` for side effects in a pipeline (inspect without modifying) ──\nconst tap = (fn) => (x) => { fn(x); return x; };\nconst log = tap(console.log);\nconst result = pipe(\n    x => x + 1,\n    log,           \u002F\u002F logs the intermediate value, passes it through\n    x => x * 2,\n    log,           \u002F\u002F logs again\n    x => x - 3,\n)(5);  \u002F\u002F logs 6 and 12, returns 9\n\n\u002F\u002F ── `memoize` with a cache (higher-order function for caching) ──\nconst memoize = (fn) => {\n    const cache = new Map();\n    return (...args) => {\n        const key = JSON.stringify(args);\n        if (!cache.has(key)) cache.set(key, fn(...args));\n        return cache.get(key);\n    };\n};\n\n\u002F\u002F ── `debounce` as a higher-order function ──\nconst debounce = (fn, ms) => {\n    let timer;\n    return (...args) => {\n        clearTimeout(timer);\n        timer = setTimeout(() => fn(...args), ms);\n    };\n};\n\n\u002F\u002F ── `once` as a higher-order function ──\nconst once = (fn) => {\n    let done = false, result;\n    return (...args) => done ? result : (done = true, result = fn(...args));\n};\n\n\u002F\u002F ── `pluck` for extracting a property from each item in an array ──\nconst pluck = (key) => (arr) => arr.map(obj => obj[key]);\nconst getNames = pluck(\"name\");\ngetNames([{ name: \"Alice\" }, { name: \"Bob\" }]);  \u002F\u002F [\"Alice\", \"Bob\"]\n",[30,3256,3257,3262,3310,3314,3319,3357,3370,3382,3396,3404,3418,3425,3439,3450,3454,3459,3478,3497,3513,3533,3566,3579,3583,3587,3591,3596,3620,3628,3644,3652,3677,3681,3685,3689,3694,3713,3728,3773,3777,3781,3786,3824,3840],{"__ignoreMap":28},[33,3258,3259],{"class":35,"line":36},[33,3260,3261],{"class":39},"\u002F\u002F ── `flow` (pipe alias) for left-to-right readability ──\n",[33,3263,3264,3266,3269,3271,3273,3275,3277,3279,3281,3283,3285,3287,3289,3291,3293,3295,3297,3299,3301,3303,3305,3307],{"class":35,"line":43},[33,3265,66],{"class":65},[33,3267,3268],{"class":97}," flow",[33,3270,73],{"class":65},[33,3272,607],{"class":76},[33,3274,610],{"class":65},[33,3276,613],{"class":104},[33,3278,269],{"class":76},[33,3280,272],{"class":65},[33,3282,607],{"class":76},[33,3284,105],{"class":104},[33,3286,269],{"class":76},[33,3288,272],{"class":65},[33,3290,628],{"class":76},[33,3292,256],{"class":97},[33,3294,259],{"class":76},[33,3296,2871],{"class":104},[33,3298,83],{"class":76},[33,3300,1084],{"class":104},[33,3302,269],{"class":76},[33,3304,272],{"class":65},[33,3306,1107],{"class":97},[33,3308,3309],{"class":76},"(v), x);\n",[33,3311,3312],{"class":35,"line":49},[33,3313,53],{"emptyLinePlaceholder":52},[33,3315,3316],{"class":35,"line":56},[33,3317,3318],{"class":39},"\u002F\u002F ── `tap` for side effects in a pipeline (inspect without modifying) ──\n",[33,3320,3321,3323,3326,3328,3330,3332,3334,3336,3338,3340,3342,3344,3347,3349,3352,3354],{"class":35,"line":62},[33,3322,66],{"class":65},[33,3324,3325],{"class":97}," tap",[33,3327,73],{"class":65},[33,3329,607],{"class":76},[33,3331,640],{"class":104},[33,3333,269],{"class":76},[33,3335,272],{"class":65},[33,3337,607],{"class":76},[33,3339,105],{"class":104},[33,3341,269],{"class":76},[33,3343,272],{"class":65},[33,3345,3346],{"class":76}," { ",[33,3348,640],{"class":97},[33,3350,3351],{"class":76},"(x); ",[33,3353,538],{"class":65},[33,3355,3356],{"class":76}," x; };\n",[33,3358,3359,3361,3363,3365,3367],{"class":35,"line":126},[33,3360,66],{"class":65},[33,3362,1476],{"class":69},[33,3364,73],{"class":65},[33,3366,3325],{"class":97},[33,3368,3369],{"class":76},"(console.log);\n",[33,3371,3372,3374,3376,3378,3380],{"class":35,"line":132},[33,3373,66],{"class":65},[33,3375,326],{"class":69},[33,3377,73],{"class":65},[33,3379,786],{"class":97},[33,3381,958],{"class":76},[33,3383,3384,3386,3388,3390,3392,3394],{"class":35,"line":138},[33,3385,1138],{"class":104},[33,3387,108],{"class":65},[33,3389,111],{"class":76},[33,3391,278],{"class":65},[33,3393,695],{"class":69},[33,3395,2517],{"class":76},[33,3397,3398,3401],{"class":35,"line":143},[33,3399,3400],{"class":76},"    log,           ",[33,3402,3403],{"class":39},"\u002F\u002F logs the intermediate value, passes it through\n",[33,3405,3406,3408,3410,3412,3414,3416],{"class":35,"line":149},[33,3407,1138],{"class":104},[33,3409,108],{"class":65},[33,3411,111],{"class":76},[33,3413,114],{"class":65},[33,3415,117],{"class":69},[33,3417,2517],{"class":76},[33,3419,3420,3422],{"class":35,"line":205},[33,3421,3400],{"class":76},[33,3423,3424],{"class":39},"\u002F\u002F logs again\n",[33,3426,3427,3429,3431,3433,3435,3437],{"class":35,"line":211},[33,3428,1138],{"class":104},[33,3430,108],{"class":65},[33,3432,111],{"class":76},[33,3434,1011],{"class":65},[33,3436,1014],{"class":69},[33,3438,2517],{"class":76},[33,3440,3441,3443,3445,3447],{"class":35,"line":217},[33,3442,1406],{"class":76},[33,3444,349],{"class":69},[33,3446,120],{"class":76},[33,3448,3449],{"class":39},"\u002F\u002F logs 6 and 12, returns 9\n",[33,3451,3452],{"class":35,"line":222},[33,3453,53],{"emptyLinePlaceholder":52},[33,3455,3456],{"class":35,"line":228},[33,3457,3458],{"class":39},"\u002F\u002F ── `memoize` with a cache (higher-order function for caching) ──\n",[33,3460,3461,3463,3466,3468,3470,3472,3474,3476],{"class":35,"line":292},[33,3462,66],{"class":65},[33,3464,3465],{"class":97}," memoize",[33,3467,73],{"class":65},[33,3469,607],{"class":76},[33,3471,640],{"class":104},[33,3473,269],{"class":76},[33,3475,272],{"class":65},[33,3477,516],{"class":76},[33,3479,3480,3483,3486,3488,3491,3494],{"class":35,"line":298},[33,3481,3482],{"class":65},"    const",[33,3484,3485],{"class":69}," cache",[33,3487,73],{"class":65},[33,3489,3490],{"class":65}," new",[33,3492,3493],{"class":97}," Map",[33,3495,3496],{"class":76},"();\n",[33,3498,3499,3501,3503,3505,3507,3509,3511],{"class":35,"line":304},[33,3500,558],{"class":65},[33,3502,607],{"class":76},[33,3504,610],{"class":65},[33,3506,1100],{"class":104},[33,3508,269],{"class":76},[33,3510,272],{"class":65},[33,3512,516],{"class":76},[33,3514,3515,3518,3521,3523,3525,3527,3530],{"class":35,"line":310},[33,3516,3517],{"class":65},"        const",[33,3519,3520],{"class":69}," key",[33,3522,73],{"class":65},[33,3524,2285],{"class":69},[33,3526,2288],{"class":76},[33,3528,3529],{"class":97},"stringify",[33,3531,3532],{"class":76},"(args);\n",[33,3534,3535,3537,3539,3542,3545,3548,3551,3554,3557,3559,3561,3563],{"class":35,"line":315},[33,3536,1261],{"class":65},[33,3538,607],{"class":76},[33,3540,3541],{"class":65},"!",[33,3543,3544],{"class":76},"cache.",[33,3546,3547],{"class":97},"has",[33,3549,3550],{"class":76},"(key)) cache.",[33,3552,3553],{"class":97},"set",[33,3555,3556],{"class":76},"(key, ",[33,3558,640],{"class":97},[33,3560,101],{"class":76},[33,3562,610],{"class":65},[33,3564,3565],{"class":76},"args));\n",[33,3567,3568,3570,3573,3576],{"class":35,"line":321},[33,3569,1312],{"class":65},[33,3571,3572],{"class":76}," cache.",[33,3574,3575],{"class":97},"get",[33,3577,3578],{"class":76},"(key);\n",[33,3580,3581],{"class":35,"line":360},[33,3582,1345],{"class":76},[33,3584,3585],{"class":35,"line":389},[33,3586,1350],{"class":76},[33,3588,3589],{"class":35,"line":412},[33,3590,53],{"emptyLinePlaceholder":52},[33,3592,3593],{"class":35,"line":449},[33,3594,3595],{"class":39},"\u002F\u002F ── `debounce` as a higher-order function ──\n",[33,3597,3598,3600,3603,3605,3607,3609,3611,3614,3616,3618],{"class":35,"line":454},[33,3599,66],{"class":65},[33,3601,3602],{"class":97}," debounce",[33,3604,73],{"class":65},[33,3606,607],{"class":76},[33,3608,640],{"class":104},[33,3610,83],{"class":76},[33,3612,3613],{"class":104},"ms",[33,3615,269],{"class":76},[33,3617,272],{"class":65},[33,3619,516],{"class":76},[33,3621,3622,3625],{"class":35,"line":460},[33,3623,3624],{"class":65},"    let",[33,3626,3627],{"class":76}," timer;\n",[33,3629,3630,3632,3634,3636,3638,3640,3642],{"class":35,"line":466},[33,3631,558],{"class":65},[33,3633,607],{"class":76},[33,3635,610],{"class":65},[33,3637,1100],{"class":104},[33,3639,269],{"class":76},[33,3641,272],{"class":65},[33,3643,516],{"class":76},[33,3645,3646,3649],{"class":35,"line":519},[33,3647,3648],{"class":97},"        clearTimeout",[33,3650,3651],{"class":76},"(timer);\n",[33,3653,3654,3657,3660,3663,3666,3668,3670,3672,3674],{"class":35,"line":555},[33,3655,3656],{"class":76},"        timer ",[33,3658,3659],{"class":65},"=",[33,3661,3662],{"class":97}," setTimeout",[33,3664,3665],{"class":76},"(() ",[33,3667,272],{"class":65},[33,3669,647],{"class":97},[33,3671,101],{"class":76},[33,3673,610],{"class":65},[33,3675,3676],{"class":76},"args), ms);\n",[33,3678,3679],{"class":35,"line":564},[33,3680,1345],{"class":76},[33,3682,3683],{"class":35,"line":1052},[33,3684,1350],{"class":76},[33,3686,3687],{"class":35,"line":1058},[33,3688,53],{"emptyLinePlaceholder":52},[33,3690,3691],{"class":35,"line":1121},[33,3692,3693],{"class":39},"\u002F\u002F ── `once` as a higher-order function ──\n",[33,3695,3696,3698,3701,3703,3705,3707,3709,3711],{"class":35,"line":1135},[33,3697,66],{"class":65},[33,3699,3700],{"class":97}," once",[33,3702,73],{"class":65},[33,3704,607],{"class":76},[33,3706,640],{"class":104},[33,3708,269],{"class":76},[33,3710,272],{"class":65},[33,3712,516],{"class":76},[33,3714,3715,3717,3720,3722,3725],{"class":35,"line":1155},[33,3716,3624],{"class":65},[33,3718,3719],{"class":76}," done ",[33,3721,3659],{"class":65},[33,3723,3724],{"class":69}," false",[33,3726,3727],{"class":76},", result;\n",[33,3729,3730,3732,3734,3736,3738,3740,3742,3744,3746,3749,3752,3755,3757,3760,3763,3765,3767,3769,3771],{"class":35,"line":1181},[33,3731,558],{"class":65},[33,3733,607],{"class":76},[33,3735,610],{"class":65},[33,3737,1100],{"class":104},[33,3739,269],{"class":76},[33,3741,272],{"class":65},[33,3743,3719],{"class":76},[33,3745,2553],{"class":65},[33,3747,3748],{"class":76}," result ",[33,3750,3751],{"class":65},":",[33,3753,3754],{"class":76}," (done ",[33,3756,3659],{"class":65},[33,3758,3759],{"class":69}," true",[33,3761,3762],{"class":76},", result ",[33,3764,3659],{"class":65},[33,3766,647],{"class":97},[33,3768,101],{"class":76},[33,3770,610],{"class":65},[33,3772,3565],{"class":76},[33,3774,3775],{"class":35,"line":1186},[33,3776,1350],{"class":76},[33,3778,3779],{"class":35,"line":3107},[33,3780,53],{"emptyLinePlaceholder":52},[33,3782,3783],{"class":35,"line":3112},[33,3784,3785],{"class":39},"\u002F\u002F ── `pluck` for extracting a property from each item in an array ──\n",[33,3787,3788,3790,3793,3795,3797,3799,3801,3803,3805,3807,3809,3811,3813,3815,3817,3819,3821],{"class":35,"line":3117},[33,3789,66],{"class":65},[33,3791,3792],{"class":97}," pluck",[33,3794,73],{"class":65},[33,3796,607],{"class":76},[33,3798,2031],{"class":104},[33,3800,269],{"class":76},[33,3802,272],{"class":65},[33,3804,607],{"class":76},[33,3806,2069],{"class":104},[33,3808,269],{"class":76},[33,3810,272],{"class":65},[33,3812,2076],{"class":76},[33,3814,98],{"class":97},[33,3816,101],{"class":76},[33,3818,1625],{"class":104},[33,3820,108],{"class":65},[33,3822,3823],{"class":76}," obj[key]);\n",[33,3825,3826,3828,3830,3832,3834,3836,3838],{"class":35,"line":3140},[33,3827,66],{"class":65},[33,3829,1926],{"class":69},[33,3831,73],{"class":65},[33,3833,3792],{"class":97},[33,3835,101],{"class":76},[33,3837,1654],{"class":1504},[33,3839,1024],{"class":76},[33,3841,3842,3845,3848,3850,3852,3854,3857],{"class":35,"line":3162},[33,3843,3844],{"class":97},"getNames",[33,3846,3847],{"class":76},"([{ name: ",[33,3849,1672],{"class":1504},[33,3851,1691],{"class":76},[33,3853,1694],{"class":1504},[33,3855,3856],{"class":76}," }]);  ",[33,3858,3859],{"class":39},"\u002F\u002F [\"Alice\", \"Bob\"]\n",[15,3861,3863],{"id":3862},"️-edge-cases-gotchas","⚠️ Edge Cases & Gotchas",[20,3865,3866],{"language":22},[24,3867,3869],{"className":26,"code":3868,"language":22,"meta":28,"style":28},"\u002F\u002F ── `reduce` on an empty array without initial value throws ──\n[].reduce((a, b) => a + b);  \u002F\u002F TypeError: Reduce of empty array with no initial value\n[].reduce((a, b) => a + b, 0);  \u002F\u002F 0 (safe — always provide initial value)\n\n\u002F\u002F ── `map` skips holes (sparse arrays) ──\n[1, , 3].map(x => x * 2);  \u002F\u002F [2, \u003Cempty>, 6] (hole skipped, not processed)\n\u002F\u002F Use [...arr].map() or arr.flat() first if you need to process all elements.\n\n\u002F\u002F ── `filter` with `Boolean` for truthiness filtering ──\n[0, 1, \"\", \"a\", null, undefined, NaN, false].filter(Boolean);  \u002F\u002F [1, \"a\"]\n\u002F\u002F Boolean is a function: Boolean(0) = false, Boolean(\"a\") = true\n\n\u002F\u002F ── `sort` mutates the original array ──\nconst arr = [3, 1, 2];\nconst sorted = arr.sort();  \u002F\u002F arr is now [1, 2, 3] (mutated!)\n\u002F\u002F Use [...arr].sort() or arr.toSorted() (ES2023) for non-mutating sort.\n\n\u002F\u002F ── `curry` with rest params: fn.length is unreliable ──\nfunction restFn(...args) { return args.reduce((a, b) => a + b, 0); }\nrestFn.length;  \u002F\u002F 0 (rest params don't count toward .length)\n\u002F\u002F curry(restFn) would call immediately (0 args >= 0 length) — currying doesn't work with rest params.\n\n\u002F\u002F ── Composition order: compose (right-to-left) vs pipe (left-to-right) ──\ncompose(f, g, h)(x)  \u002F\u002F = f(g(h(x))) — right-to-left\npipe(f, g, h)(x)     \u002F\u002F = h(g(f(x))) — left-to-right\n\u002F\u002F Don't mix them up — use the one that reads naturally for your use case.\n",[30,3870,3871,3876,3905,3936,3940,3945,3977,3982,3986,3991,4040,4045,4049,4054,4077,4097,4102,4106,4111,4158,4171,4176,4180,4185,4196,4207],{"__ignoreMap":28},[33,3872,3873],{"class":35,"line":36},[33,3874,3875],{"class":39},"\u002F\u002F ── `reduce` on an empty array without initial value throws ──\n",[33,3877,3878,3881,3883,3885,3887,3889,3891,3893,3895,3897,3899,3902],{"class":35,"line":43},[33,3879,3880],{"class":76},"[].",[33,3882,256],{"class":97},[33,3884,259],{"class":76},[33,3886,421],{"class":104},[33,3888,83],{"class":76},[33,3890,426],{"class":104},[33,3892,269],{"class":76},[33,3894,272],{"class":65},[33,3896,433],{"class":76},[33,3898,278],{"class":65},[33,3900,3901],{"class":76}," b);  ",[33,3903,3904],{"class":39},"\u002F\u002F TypeError: Reduce of empty array with no initial value\n",[33,3906,3907,3909,3911,3913,3915,3917,3919,3921,3923,3925,3927,3929,3931,3933],{"class":35,"line":49},[33,3908,3880],{"class":76},[33,3910,256],{"class":97},[33,3912,259],{"class":76},[33,3914,421],{"class":104},[33,3916,83],{"class":76},[33,3918,426],{"class":104},[33,3920,269],{"class":76},[33,3922,272],{"class":65},[33,3924,433],{"class":76},[33,3926,278],{"class":65},[33,3928,438],{"class":76},[33,3930,284],{"class":69},[33,3932,120],{"class":76},[33,3934,3935],{"class":39},"\u002F\u002F 0 (safe — always provide initial value)\n",[33,3937,3938],{"class":35,"line":56},[33,3939,53],{"emptyLinePlaceholder":52},[33,3941,3942],{"class":35,"line":62},[33,3943,3944],{"class":39},"\u002F\u002F ── `map` skips holes (sparse arrays) ──\n",[33,3946,3947,3949,3951,3954,3956,3958,3960,3962,3964,3966,3968,3970,3972,3974],{"class":35,"line":126},[33,3948,2681],{"class":76},[33,3950,80],{"class":69},[33,3952,3953],{"class":76},", , ",[33,3955,91],{"class":69},[33,3957,94],{"class":76},[33,3959,98],{"class":97},[33,3961,101],{"class":76},[33,3963,105],{"class":104},[33,3965,108],{"class":65},[33,3967,111],{"class":76},[33,3969,114],{"class":65},[33,3971,117],{"class":69},[33,3973,120],{"class":76},[33,3975,3976],{"class":39},"\u002F\u002F [2, \u003Cempty>, 6] (hole skipped, not processed)\n",[33,3978,3979],{"class":35,"line":132},[33,3980,3981],{"class":39},"\u002F\u002F Use [...arr].map() or arr.flat() first if you need to process all elements.\n",[33,3983,3984],{"class":35,"line":138},[33,3985,53],{"emptyLinePlaceholder":52},[33,3987,3988],{"class":35,"line":143},[33,3989,3990],{"class":39},"\u002F\u002F ── `filter` with `Boolean` for truthiness filtering ──\n",[33,3992,3993,3995,3997,3999,4001,4003,4006,4008,4011,4013,4015,4017,4020,4022,4025,4027,4030,4032,4034,4037],{"class":35,"line":149},[33,3994,2681],{"class":76},[33,3996,284],{"class":69},[33,3998,83],{"class":76},[33,4000,80],{"class":69},[33,4002,83],{"class":76},[33,4004,4005],{"class":1504},"\"\"",[33,4007,83],{"class":76},[33,4009,4010],{"class":1504},"\"a\"",[33,4012,83],{"class":76},[33,4014,1872],{"class":69},[33,4016,83],{"class":76},[33,4018,4019],{"class":69},"undefined",[33,4021,83],{"class":76},[33,4023,4024],{"class":69},"NaN",[33,4026,83],{"class":76},[33,4028,4029],{"class":69},"false",[33,4031,94],{"class":76},[33,4033,178],{"class":97},[33,4035,4036],{"class":76},"(Boolean);  ",[33,4038,4039],{"class":39},"\u002F\u002F [1, \"a\"]\n",[33,4041,4042],{"class":35,"line":205},[33,4043,4044],{"class":39},"\u002F\u002F Boolean is a function: Boolean(0) = false, Boolean(\"a\") = true\n",[33,4046,4047],{"class":35,"line":211},[33,4048,53],{"emptyLinePlaceholder":52},[33,4050,4051],{"class":35,"line":217},[33,4052,4053],{"class":39},"\u002F\u002F ── `sort` mutates the original array ──\n",[33,4055,4056,4058,4061,4063,4065,4067,4069,4071,4073,4075],{"class":35,"line":222},[33,4057,66],{"class":65},[33,4059,4060],{"class":69}," arr",[33,4062,73],{"class":65},[33,4064,77],{"class":76},[33,4066,91],{"class":69},[33,4068,83],{"class":76},[33,4070,80],{"class":69},[33,4072,83],{"class":76},[33,4074,86],{"class":69},[33,4076,2355],{"class":76},[33,4078,4079,4081,4084,4086,4088,4091,4094],{"class":35,"line":228},[33,4080,66],{"class":65},[33,4082,4083],{"class":69}," sorted",[33,4085,73],{"class":65},[33,4087,2076],{"class":76},[33,4089,4090],{"class":97},"sort",[33,4092,4093],{"class":76},"();  ",[33,4095,4096],{"class":39},"\u002F\u002F arr is now [1, 2, 3] (mutated!)\n",[33,4098,4099],{"class":35,"line":292},[33,4100,4101],{"class":39},"\u002F\u002F Use [...arr].sort() or arr.toSorted() (ES2023) for non-mutating sort.\n",[33,4103,4104],{"class":35,"line":298},[33,4105,53],{"emptyLinePlaceholder":52},[33,4107,4108],{"class":35,"line":304},[33,4109,4110],{"class":39},"\u002F\u002F ── `curry` with rest params: fn.length is unreliable ──\n",[33,4112,4113,4116,4119,4121,4123,4125,4128,4130,4133,4135,4137,4139,4141,4143,4145,4147,4149,4151,4153,4155],{"class":35,"line":310},[33,4114,4115],{"class":65},"function",[33,4117,4118],{"class":97}," restFn",[33,4120,101],{"class":76},[33,4122,610],{"class":65},[33,4124,1100],{"class":104},[33,4126,4127],{"class":76},") { ",[33,4129,538],{"class":65},[33,4131,4132],{"class":76}," args.",[33,4134,256],{"class":97},[33,4136,259],{"class":76},[33,4138,421],{"class":104},[33,4140,83],{"class":76},[33,4142,426],{"class":104},[33,4144,269],{"class":76},[33,4146,272],{"class":65},[33,4148,433],{"class":76},[33,4150,278],{"class":65},[33,4152,438],{"class":76},[33,4154,284],{"class":69},[33,4156,4157],{"class":76},"); }\n",[33,4159,4160,4163,4165,4168],{"class":35,"line":315},[33,4161,4162],{"class":76},"restFn.",[33,4164,1267],{"class":69},[33,4166,4167],{"class":76},";  ",[33,4169,4170],{"class":39},"\u002F\u002F 0 (rest params don't count toward .length)\n",[33,4172,4173],{"class":35,"line":321},[33,4174,4175],{"class":39},"\u002F\u002F curry(restFn) would call immediately (0 args >= 0 length) — currying doesn't work with rest params.\n",[33,4177,4178],{"class":35,"line":360},[33,4179,53],{"emptyLinePlaceholder":52},[33,4181,4182],{"class":35,"line":389},[33,4183,4184],{"class":39},"\u002F\u002F ── Composition order: compose (right-to-left) vs pipe (left-to-right) ──\n",[33,4186,4187,4190,4193],{"class":35,"line":412},[33,4188,4189],{"class":97},"compose",[33,4191,4192],{"class":76},"(f, g, h)(x)  ",[33,4194,4195],{"class":39},"\u002F\u002F = f(g(h(x))) — right-to-left\n",[33,4197,4198,4201,4204],{"class":35,"line":449},[33,4199,4200],{"class":97},"pipe",[33,4202,4203],{"class":76},"(f, g, h)(x)     ",[33,4205,4206],{"class":39},"\u002F\u002F = h(g(f(x))) — left-to-right\n",[33,4208,4209],{"class":35,"line":454},[33,4210,4211],{"class":39},"\u002F\u002F Don't mix them up — use the one that reads naturally for your use case.\n",[15,4213,4215],{"id":4214},"quick-quiz","🧠 Quick Quiz",[4217,4218,4219],"p",{},"What does this output?",[20,4221,4222],{"language":22},[24,4223,4225],{"className":26,"code":4224,"language":22,"meta":28,"style":28},"const pipe = (...fns) => fns.reduce((f, g) => (...args) => g(f(...args)));\nconst add = x => x + 1;\nconst mul = x => x * 2;\nconst result = pipe(add, mul)(3);\nconsole.log(result);\n",[30,4226,4227,4284,4304,4325,4342],{"__ignoreMap":28},[33,4228,4229,4231,4233,4235,4237,4239,4241,4243,4245,4247,4249,4251,4253,4255,4257,4259,4261,4263,4265,4267,4269,4271,4274,4276,4278,4280,4282],{"class":35,"line":36},[33,4230,66],{"class":65},[33,4232,786],{"class":97},[33,4234,73],{"class":65},[33,4236,607],{"class":76},[33,4238,610],{"class":65},[33,4240,613],{"class":104},[33,4242,269],{"class":76},[33,4244,272],{"class":65},[33,4246,628],{"class":76},[33,4248,256],{"class":97},[33,4250,259],{"class":76},[33,4252,1084],{"class":104},[33,4254,83],{"class":76},[33,4256,1089],{"class":104},[33,4258,269],{"class":76},[33,4260,272],{"class":65},[33,4262,607],{"class":76},[33,4264,610],{"class":65},[33,4266,1100],{"class":104},[33,4268,269],{"class":76},[33,4270,272],{"class":65},[33,4272,4273],{"class":97}," g",[33,4275,101],{"class":76},[33,4277,1084],{"class":97},[33,4279,101],{"class":76},[33,4281,610],{"class":65},[33,4283,1118],{"class":76},[33,4285,4286,4288,4290,4292,4294,4296,4298,4300,4302],{"class":35,"line":43},[33,4287,66],{"class":65},[33,4289,1361],{"class":97},[33,4291,73],{"class":65},[33,4293,666],{"class":104},[33,4295,108],{"class":65},[33,4297,111],{"class":76},[33,4299,278],{"class":65},[33,4301,695],{"class":69},[33,4303,698],{"class":76},[33,4305,4306,4308,4311,4313,4315,4317,4319,4321,4323],{"class":35,"line":49},[33,4307,66],{"class":65},[33,4309,4310],{"class":97}," mul",[33,4312,73],{"class":65},[33,4314,666],{"class":104},[33,4316,108],{"class":65},[33,4318,111],{"class":76},[33,4320,114],{"class":65},[33,4322,117],{"class":69},[33,4324,698],{"class":76},[33,4326,4327,4329,4331,4333,4335,4338,4340],{"class":35,"line":56},[33,4328,66],{"class":65},[33,4330,326],{"class":69},[33,4332,73],{"class":65},[33,4334,786],{"class":97},[33,4336,4337],{"class":76},"(add, mul)(",[33,4339,91],{"class":69},[33,4341,1024],{"class":76},[33,4343,4344,4346,4348],{"class":35,"line":62},[33,4345,747],{"class":76},[33,4347,750],{"class":97},[33,4349,4350],{"class":76},"(result);\n",[4352,4353,4354,4358,4363,4369,4423],"details",{},[4355,4356,4357],"summary",{},"Answer",[4217,4359,4360],{},[30,4361,4362],{},"8",[4217,4364,4365,4366,4368],{},"Let's trace through the ",[30,4367,4200],{}," implementation:",[4370,4371,4372,4382,4404,4410],"ol",{},[4373,4374,4375,4378,4379],"li",{},[30,4376,4377],{},"pipe(add, mul)"," → ",[30,4380,4381],{},"fns = [add, mul]",[4373,4383,4384,4387,4388],{},[30,4385,4386],{},".reduce((f, g) => (...args) => g(f(...args)))",":\n",[4389,4390,4391],"ul",{},[4373,4392,4393,4394,83,4397,4400,4401],{},"First iteration: ",[30,4395,4396],{},"f = add",[30,4398,4399],{},"g = mul"," → returns ",[30,4402,4403],{},"(...args) => mul(add(...args))",[4373,4405,4406,4407],{},"So ",[30,4408,4409],{},"result = (...args) => mul(add(...args))",[4373,4411,4412,4378,4415,4378,4418,4378,4421],{},[30,4413,4414],{},"result(3)",[30,4416,4417],{},"mul(add(3))",[30,4419,4420],{},"mul(4)",[30,4422,4362],{},[4217,4424,4425,4429,4430,4432,4433,4436,4437,4439,4440,4443,4444,4446],{},[4426,4427,4428],"strong",{},"The lesson",": this ",[30,4431,4200],{}," implementation applies functions ",[4426,4434,4435],{},"left-to-right"," (like a pipeline). ",[30,4438,1399],{}," runs first (input: 3 → output: 4), then ",[30,4441,4442],{},"mul"," runs (input: 4 → output: 8). This is the opposite of ",[30,4445,4189],{},", which applies right-to-left.",[4448,4449,4450],"style",{},"html pre.shiki code .sdCPZ, html code.shiki .sdCPZ{--shiki-default:#6A737D;--shiki-github-dark:#6A737D}html pre.shiki code .svdQ7, html code.shiki .svdQ7{--shiki-default:#D73A49;--shiki-github-dark:#F97583}html pre.shiki code .snvgF, html code.shiki .snvgF{--shiki-default:#005CC5;--shiki-github-dark:#79B8FF}html pre.shiki code .ssxIu, html code.shiki .ssxIu{--shiki-default:#24292E;--shiki-github-dark:#E1E4E8}html pre.shiki code .sIsaT, html code.shiki .sIsaT{--shiki-default:#6F42C1;--shiki-github-dark:#B392F0}html pre.shiki code .sCrzJ, html code.shiki .sCrzJ{--shiki-default:#E36209;--shiki-github-dark:#FFAB70}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .github-dark .shiki span {color: var(--shiki-github-dark);background: var(--shiki-github-dark-bg);font-style: var(--shiki-github-dark-font-style);font-weight: var(--shiki-github-dark-font-weight);text-decoration: var(--shiki-github-dark-text-decoration);}html.github-dark .shiki span {color: var(--shiki-github-dark);background: var(--shiki-github-dark-bg);font-style: var(--shiki-github-dark-font-style);font-weight: var(--shiki-github-dark-font-weight);text-decoration: var(--shiki-github-dark-text-decoration);}html pre.shiki code .sJ6F3, html code.shiki .sJ6F3{--shiki-default:#032F62;--shiki-github-dark:#9ECBFF}html pre.shiki code .svAP2, html code.shiki .svAP2{--shiki-default:#032F62;--shiki-github-dark:#DBEDFF}",{"title":28,"searchDepth":43,"depth":43,"links":4452},[4453,4454,4455,4456,4457,4458,4459,4460],{"id":17,"depth":43,"text":18},{"id":577,"depth":43,"text":578},{"id":1205,"depth":43,"text":1206},{"id":1897,"depth":43,"text":1898},{"id":2451,"depth":43,"text":2452},{"id":3248,"depth":43,"text":3249},{"id":3862,"depth":43,"text":3863},{"id":4214,"depth":43,"text":4215},"Deep-dive into higher-order functions: map\u002Ffilter\u002Freduce internals, function composition pipelines, currying and partial application, point-free style, and the functor\u002Fmonad patterns. Code-first reference for senior engineers.","md",{},"\u002Fjs\u002F13-higher-order-functions",{"title":5,"description":4461},"js\u002F13-higher-order-functions","MtymSJUkA2F7LTfNXi3x0TCvtCaGOKR16sIofKGqVZs",1789924649243]