diff --git a/bench/resources/README.md b/bench/resources/README.md index 7f2dbb62..9a69caad 100644 --- a/bench/resources/README.md +++ b/bench/resources/README.md @@ -12,3 +12,6 @@ Licensed under Apache 2.0, see https://github.com/google/jsonnet/blob/7d1cbf8e69 ## go_suite These are benchmarks copied from the Go Jsonnet implementation's test suite. Licensed under Apache 2.0, see https://github.com/google/go-jsonnet/blob/10aef6a96ca825c97c87df137a837e39f5df174c/LICENSE + +## sjsonnet_suite +Benchmarks created by this project. diff --git a/bench/resources/sjsonnet_suite/setDiff.jsonnet b/bench/resources/sjsonnet_suite/setDiff.jsonnet new file mode 100644 index 00000000..7af93fe5 --- /dev/null +++ b/bench/resources/sjsonnet_suite/setDiff.jsonnet @@ -0,0 +1,22 @@ +{ + local sets = [ + [2,3,21,23,26,31,49,51,56,68,78,81,84,91,98,100,111,114,116,133,141,149,159,166,167,169,178,184,185,186,188,190,205,208,209,215,226,227,232,236,239,240,243,246,252,255,259,260,261,265,269,287,290,304,309,328,340,344,351,352,373,391,396,397,399,407,409,411,413,415,418,419,431,434,435,436,441,443,446,462,465,476,478,480,488,491,494,499,518,520,522,539,549,553,554,557,564,577,584,586,588,611,612,615,622,627,629,630,634,639,645,663,673,674,680,684,690,692,706,707,709,715,721,727,735,737,740,746,749,754,756,764,767,769,779,780,785,787,794,800,802,808,811,818,821,843,855,859,863,867,868,882,886,891,896,901,906,907,911,917,918,924,933,936,943,945,947,950,953,955,958,959,963,969,970,978,982,984,985,986,996], + [2,5,8,15,16,19,22,23,32,43,58,61,72,73,80,91,94,96,102,107,108,110,113,119,128,130,132,141,143,156,157,166,168,171,177,178,185,194,198,210,215,221,222,228,233,250,251,259,267,273,274,284,293,297,300,306,307,328,333,337,339,344,346,347,348,366,374,376,379,381,383,396,397,412,415,417,419,421,423,424,427,433,446,453,458,459,462,472,473,474,498,501,512,514,535,548,557,572,576,584,601,603,618,623,629,630,634,639,650,654,658,660,667,678,692,696,698,703,705,706,712,716,718,722,730,734,736,745,754,755,756,769,772,782,784,791,792,794,798,799,802,812,815,824,826,831,840,843,858,860,864,868,873,881,882,883,884,887,888,890,895,896,900,924,931,934,938,940,950,953,955,959,963,972,974,985,998], + [1,3,6,15,31,32,42,44,55,63,64,67,69,70,81,87,88,89,93,100,104,111,119,123,130,132,141,143,151,154,159,161,167,168,170,174,179,180,181,188,192,197,198,203,222,229,237,244,245,248,253,262,272,289,290,300,307,308,309,311,315,320,331,332,337,340,343,350,352,357,359,361,367,369,381,396,397,402,411,415,420,426,432,433,439,447,452,455,459,461,472,477,483,486,504,505,526,535,538,542,548,553,556,560,562,563,567,578,580,585,586,587,593,599,610,621,631,639,650,651,653,670,672,675,677,679,680,686,691,698,705,708,713,721,726,727,739,742,743,747,755,758,760,778,790,795,796,800,802,803,808,818,823,827,828,838,844,848,849,862,866,870,885,888,908,919,921,927,950,953,959,963,964,968,976,992,1000], + [1,13,16,27,35,50,53,58,65,66,67,70,71,72,73,74,88,95,96,98,99,106,112,116,119,133,134,136,139,143,155,166,170,179,183,186,187,190,193,195,203,204,211,212,225,234,235,237,238,243,248,254,261,265,267,268,277,279,293,314,334,350,351,352,354,358,364,368,371,372,376,394,405,409,410,422,433,437,439,461,463,470,473,484,492,493,511,516,528,545,550,552,554,558,561,565,588,605,613,625,626,630,631,644,653,660,664,671,686,690,692,694,696,706,714,715,717,720,721,722,723,727,738,744,745,753,755,763,771,772,776,779,784,786,788,793,794,795,798,799,801,811,816,817,838,841,844,845,857,858,865,869,872,878,888,892,894,895,896,911,915,916,921,922,934,937,940,947,951,952,955,957,958,978,982,987,997,998], + [2,7,9,21,22,24,30,37,42,52,65,67,88,89,90,132,136,140,141,142,144,152,153,156,167,171,179,181,190,193,195,196,200,209,212,231,242,246,249,253,261,277,286,295,301,304,312,319,323,328,334,341,342,346,349,351,354,364,368,369,380,382,383,384,397,413,414,415,419,421,433,434,437,448,454,465,485,486,490,499,504,506,510,517,525,526,527,539,540,543,545,553,554,561,573,574,581,588,591,594,596,605,606,608,631,639,640,645,649,650,663,694,696,697,707,709,714,715,716,721,724,730,731,732,737,739,740,742,749,755,761,767,773,774,777,782,787,792,801,802,804,806,810,811,830,837,841,843,846,848,850,853,856,869,875,878,879,880,881,885,889,897,900,905,907,920,921,930,934,953,956,966,977,986,988,991,996], + [3,11,15,20,31,33,38,48,50,56,59,60,72,75,78,88,95,96,97,103,113,125,127,130,131,132,134,142,149,153,178,185,187,195,219,222,223,247,251,252,258,261,273,277,281,292,295,304,306,308,309,319,322,326,327,357,368,376,387,390,394,414,433,435,438,447,455,473,477,488,489,490,501,509,511,517,534,537,539,545,546,557,558,566,579,585,589,600,603,606,609,616,620,621,636,638,639,645,652,670,671,679,687,703,706,707,720,722,723,724,728,733,739,744,746,747,751,752,754,757,758,764,776,781,783,785,787,789,795,797,803,805,810,811,812,815,816,829,837,847,856,858,860,862,870,881,886,890,894,895,896,900,914,924,927,932,933,935,938,939,948,970,971,973,974,975,976,982,990,1000], + [2,7,9,12,13,15,17,18,19,27,29,33,41,42,45,50,60,62,64,74,81,84,85,90,92,94,99,104,106,111,112,115,121,125,126,143,152,153,160,163,172,174,177,181,189,199,203,211,212,224,227,231,235,238,239,259,262,266,272,279,280,284,288,290,293,302,320,337,340,342,351,361,364,365,366,373,374,377,389,392,399,408,410,415,423,439,452,454,463,464,475,488,491,498,500,503,518,519,520,526,529,536,537,538,539,547,550,555,557,560,561,564,567,571,573,581,597,610,615,618,619,625,629,640,650,652,657,662,669,676,682,683,689,699,700,728,732,735,737,742,743,748,757,769,772,789,798,799,801,809,813,815,816,824,825,826,842,848,852,856,859,861,867,869,872,875,877,884,886,895,914,925,937,947,948,959,961,965,966,971,974,981,997,999], + [10,15,37,39,40,69,71,72,73,74,75,78,79,86,87,90,98,104,106,116,124,131,132,133,138,151,157,159,160,164,168,178,180,182,204,211,213,217,218,228,233,240,244,246,247,250,257,259,262,270,272,276,289,293,300,332,335,341,344,349,363,376,390,397,406,410,414,427,431,433,437,446,447,453,459,460,461,465,468,472,476,496,501,512,516,520,523,529,530,531,534,545,551,555,562,566,569,579,584,585,589,593,595,596,600,614,615,616,629,634,647,650,651,653,654,656,659,675,679,692,713,718,720,722,727,741,744,746,750,753,754,762,763,764,765,766,767,775,777,779,780,782,785,787,789,794,800,801,810,812,817,824,828,830,833,836,838,842,845,847,851,883,884,887,891,892,896,904,907,916,917,927,939,943,961,963,964,983,984,989,998,999], + [6,10,11,14,17,24,27,28,55,56,64,70,88,93,94,95,97,98,110,116,117,118,120,124,125,129,132,137,138,141,150,153,156,158,159,161,166,167,175,180,183,184,185,188,189,191,198,211,220,221,222,232,237,243,251,260,270,278,290,298,303,307,310,315,322,323,328,343,357,364,365,369,387,392,414,433,448,455,456,462,478,479,482,483,496,500,509,511,512,521,523,525,530,536,540,544,545,553,561,564,571,572,577,578,581,601,602,606,620,625,633,637,642,643,644,650,657,662,665,674,675,683,689,690,693,698,704,708,744,753,757,764,767,773,777,780,781,794,799,801,803,827,830,832,836,845,846,855,859,863,864,870,876,885,887,891,894,897,901,902,910,915,916,920,923,930,939,948,956,957,967,970,972,977,981,983,985,994], + [1,7,9,12,25,26,32,33,38,52,55,64,74,75,80,84,94,100,103,117,121,132,133,134,135,137,145,157,174,175,178,182,189,194,197,217,218,222,230,240,242,249,257,259,270,271,275,276,277,282,285,298,301,302,305,306,310,315,316,318,328,329,330,336,350,365,367,377,381,384,402,406,416,424,425,428,440,443,448,449,452,457,469,473,480,482,488,495,506,511,512,517,527,531,535,537,543,545,557,567,579,585,596,599,615,618,622,624,627,628,633,636,639,641,645,647,653,655,659,660,692,700,705,712,715,716,717,718,720,722,726,732,735,736,745,758,785,795,796,798,805,806,808,815,817,819,823,826,839,845,849,850,854,872,878,880,884,885,887,888,893,898,901,906,914,924,928,932,941,942,967,969,971,975,976,982,988,994,999], + ], + + foo: [ + std.foldl( + function(a, b) std.setDiff(a, b), + sets[first+1:], + sets[first] + ) for first in std.range(0, std.length(sets) - 2) + ], +} diff --git a/bench/resources/sjsonnet_suite/setDiff.jsonnet.golden b/bench/resources/sjsonnet_suite/setDiff.jsonnet.golden new file mode 100644 index 00000000..3a0a533d --- /dev/null +++ b/bench/resources/sjsonnet_suite/setDiff.jsonnet.golden @@ -0,0 +1,701 @@ +{ + "foo": [ + [ + 49, + 51, + 68, + 114, + 169, + 205, + 208, + 226, + 236, + 255, + 269, + 287, + 391, + 407, + 418, + 436, + 441, + 494, + 522, + 549, + 611, + 612, + 673, + 684, + 821, + 918, + 936, + 945 + ], + [ + 5, + 8, + 23, + 43, + 61, + 91, + 102, + 107, + 108, + 128, + 210, + 215, + 274, + 297, + 333, + 339, + 347, + 348, + 379, + 412, + 417, + 458, + 474, + 514, + 576, + 623, + 658, + 667, + 678, + 734, + 756, + 791, + 831, + 840, + 868, + 873, + 882, + 931 + ], + [ + 44, + 63, + 123, + 154, + 192, + 229, + 245, + 311, + 331, + 359, + 396, + 411, + 420, + 426, + 432, + 505, + 542, + 548, + 556, + 563, + 580, + 586, + 587, + 672, + 677, + 680, + 691, + 760, + 778, + 790, + 818, + 866, + 908, + 919, + 950, + 968, + 992 + ], + [ + 16, + 35, + 53, + 58, + 66, + 119, + 139, + 155, + 170, + 186, + 225, + 234, + 248, + 254, + 265, + 267, + 268, + 314, + 352, + 358, + 371, + 372, + 405, + 409, + 422, + 470, + 484, + 492, + 493, + 528, + 552, + 565, + 613, + 626, + 630, + 664, + 686, + 738, + 771, + 784, + 786, + 788, + 793, + 844, + 857, + 865, + 911, + 922, + 940, + 951, + 952, + 955, + 958, + 978, + 987 + ], + [ + 21, + 22, + 30, + 65, + 67, + 89, + 136, + 140, + 144, + 171, + 179, + 190, + 193, + 196, + 200, + 209, + 253, + 286, + 312, + 334, + 346, + 354, + 380, + 382, + 383, + 413, + 419, + 421, + 434, + 485, + 486, + 499, + 504, + 510, + 554, + 574, + 588, + 591, + 594, + 605, + 608, + 631, + 649, + 663, + 694, + 696, + 697, + 709, + 714, + 721, + 730, + 731, + 740, + 749, + 755, + 761, + 774, + 792, + 802, + 804, + 841, + 843, + 853, + 879, + 889, + 905, + 921, + 934, + 953, + 986, + 991, + 996 + ], + [ + 3, + 20, + 31, + 48, + 59, + 96, + 113, + 127, + 130, + 142, + 149, + 187, + 195, + 219, + 223, + 252, + 258, + 261, + 273, + 281, + 292, + 295, + 304, + 308, + 309, + 319, + 326, + 327, + 368, + 394, + 435, + 438, + 477, + 489, + 490, + 546, + 558, + 603, + 609, + 621, + 638, + 670, + 671, + 687, + 703, + 706, + 707, + 723, + 724, + 733, + 739, + 747, + 751, + 752, + 776, + 783, + 797, + 811, + 829, + 837, + 858, + 860, + 862, + 881, + 890, + 900, + 933, + 935, + 938, + 973, + 990, + 1000 + ], + [ + 2, + 13, + 18, + 19, + 29, + 41, + 42, + 45, + 50, + 60, + 62, + 81, + 85, + 92, + 99, + 111, + 112, + 115, + 126, + 143, + 152, + 163, + 172, + 177, + 181, + 199, + 203, + 212, + 224, + 227, + 231, + 235, + 238, + 239, + 266, + 279, + 280, + 284, + 288, + 320, + 337, + 340, + 342, + 351, + 361, + 366, + 373, + 374, + 389, + 399, + 408, + 415, + 423, + 439, + 454, + 463, + 464, + 475, + 491, + 498, + 503, + 518, + 519, + 526, + 538, + 539, + 547, + 550, + 560, + 573, + 597, + 610, + 619, + 640, + 652, + 669, + 676, + 682, + 699, + 728, + 737, + 742, + 743, + 748, + 769, + 772, + 809, + 813, + 816, + 825, + 848, + 852, + 856, + 861, + 867, + 869, + 875, + 877, + 886, + 895, + 925, + 937, + 947, + 959, + 965, + 966, + 974, + 997 + ], + [ + 15, + 37, + 39, + 40, + 69, + 71, + 72, + 73, + 78, + 79, + 86, + 87, + 90, + 104, + 106, + 131, + 151, + 160, + 164, + 168, + 204, + 213, + 228, + 233, + 244, + 246, + 247, + 250, + 262, + 272, + 289, + 293, + 300, + 332, + 335, + 341, + 344, + 349, + 363, + 376, + 390, + 397, + 410, + 427, + 431, + 437, + 446, + 447, + 453, + 459, + 460, + 461, + 465, + 468, + 472, + 476, + 501, + 516, + 520, + 529, + 534, + 551, + 555, + 562, + 566, + 569, + 584, + 589, + 593, + 595, + 600, + 614, + 616, + 629, + 634, + 651, + 654, + 656, + 679, + 713, + 727, + 741, + 746, + 750, + 754, + 762, + 763, + 765, + 766, + 775, + 779, + 782, + 787, + 789, + 800, + 810, + 812, + 824, + 828, + 833, + 838, + 842, + 847, + 851, + 883, + 892, + 896, + 904, + 907, + 917, + 927, + 943, + 961, + 963, + 964, + 984, + 989, + 998 + ], + [ + 6, + 10, + 11, + 14, + 17, + 24, + 27, + 28, + 56, + 70, + 88, + 93, + 95, + 97, + 98, + 110, + 116, + 118, + 120, + 124, + 125, + 129, + 138, + 141, + 150, + 153, + 156, + 158, + 159, + 161, + 166, + 167, + 180, + 183, + 184, + 185, + 188, + 191, + 198, + 211, + 220, + 221, + 232, + 237, + 243, + 251, + 260, + 278, + 290, + 303, + 307, + 322, + 323, + 343, + 357, + 364, + 369, + 387, + 392, + 414, + 433, + 455, + 456, + 462, + 478, + 479, + 483, + 496, + 500, + 509, + 521, + 523, + 525, + 530, + 536, + 540, + 544, + 553, + 561, + 564, + 571, + 572, + 577, + 578, + 581, + 601, + 602, + 606, + 620, + 625, + 637, + 642, + 643, + 644, + 650, + 657, + 662, + 665, + 674, + 675, + 683, + 689, + 690, + 693, + 698, + 704, + 708, + 744, + 753, + 757, + 764, + 767, + 773, + 777, + 780, + 781, + 794, + 799, + 801, + 803, + 827, + 830, + 832, + 836, + 846, + 855, + 859, + 863, + 864, + 870, + 876, + 891, + 894, + 897, + 902, + 910, + 915, + 916, + 920, + 923, + 930, + 939, + 948, + 956, + 957, + 970, + 972, + 977, + 981, + 983, + 985 + ] + ] +} diff --git a/bench/resources/sjsonnet_suite/setInter.jsonnet b/bench/resources/sjsonnet_suite/setInter.jsonnet new file mode 100644 index 00000000..d81d910f --- /dev/null +++ b/bench/resources/sjsonnet_suite/setInter.jsonnet @@ -0,0 +1,22 @@ +{ + local sets = [ + [2,3,21,23,26,31,49,51,56,68,78,81,84,91,98,100,111,114,116,133,141,149,159,166,167,169,178,184,185,186,188,190,205,208,209,215,226,227,232,236,239,240,243,246,252,255,259,260,261,265,269,287,290,304,309,328,340,344,351,352,373,391,396,397,399,407,409,411,413,415,418,419,431,434,435,436,441,443,446,462,465,476,478,480,488,491,494,499,518,520,522,539,549,553,554,557,564,577,584,586,588,611,612,615,622,627,629,630,634,639,645,663,673,674,680,684,690,692,706,707,709,715,721,727,735,737,740,746,749,754,756,764,767,769,779,780,785,787,794,800,802,808,811,818,821,843,855,859,863,867,868,882,886,891,896,901,906,907,911,917,918,924,933,936,943,945,947,950,953,955,958,959,963,969,970,978,982,984,985,986,996], + [2,5,8,15,16,19,22,23,32,43,58,61,72,73,80,91,94,96,102,107,108,110,113,119,128,130,132,141,143,156,157,166,168,171,177,178,185,194,198,210,215,221,222,228,233,250,251,259,267,273,274,284,293,297,300,306,307,328,333,337,339,344,346,347,348,366,374,376,379,381,383,396,397,412,415,417,419,421,423,424,427,433,446,453,458,459,462,472,473,474,498,501,512,514,535,548,557,572,576,584,601,603,618,623,629,630,634,639,650,654,658,660,667,678,692,696,698,703,705,706,712,716,718,722,730,734,736,745,754,755,756,769,772,782,784,791,792,794,798,799,802,812,815,824,826,831,840,843,858,860,864,868,873,881,882,883,884,887,888,890,895,896,900,924,931,934,938,940,950,953,955,959,963,972,974,985,998], + [1,3,6,15,31,32,42,44,55,63,64,67,69,70,81,87,88,89,93,100,104,111,119,123,130,132,141,143,151,154,159,161,167,168,170,174,179,180,181,188,192,197,198,203,222,229,237,244,245,248,253,262,272,289,290,300,307,308,309,311,315,320,331,332,337,340,343,350,352,357,359,361,367,369,381,396,397,402,411,415,420,426,432,433,439,447,452,455,459,461,472,477,483,486,504,505,526,535,538,542,548,553,556,560,562,563,567,578,580,585,586,587,593,599,610,621,631,639,650,651,653,670,672,675,677,679,680,686,691,698,705,708,713,721,726,727,739,742,743,747,755,758,760,778,790,795,796,800,802,803,808,818,823,827,828,838,844,848,849,862,866,870,885,888,908,919,921,927,950,953,959,963,964,968,976,992,1000], + [1,13,16,27,35,50,53,58,65,66,67,70,71,72,73,74,88,95,96,98,99,106,112,116,119,133,134,136,139,143,155,166,170,179,183,186,187,190,193,195,203,204,211,212,225,234,235,237,238,243,248,254,261,265,267,268,277,279,293,314,334,350,351,352,354,358,364,368,371,372,376,394,405,409,410,422,433,437,439,461,463,470,473,484,492,493,511,516,528,545,550,552,554,558,561,565,588,605,613,625,626,630,631,644,653,660,664,671,686,690,692,694,696,706,714,715,717,720,721,722,723,727,738,744,745,753,755,763,771,772,776,779,784,786,788,793,794,795,798,799,801,811,816,817,838,841,844,845,857,858,865,869,872,878,888,892,894,895,896,911,915,916,921,922,934,937,940,947,951,952,955,957,958,978,982,987,997,998], + [2,7,9,21,22,24,30,37,42,52,65,67,88,89,90,132,136,140,141,142,144,152,153,156,167,171,179,181,190,193,195,196,200,209,212,231,242,246,249,253,261,277,286,295,301,304,312,319,323,328,334,341,342,346,349,351,354,364,368,369,380,382,383,384,397,413,414,415,419,421,433,434,437,448,454,465,485,486,490,499,504,506,510,517,525,526,527,539,540,543,545,553,554,561,573,574,581,588,591,594,596,605,606,608,631,639,640,645,649,650,663,694,696,697,707,709,714,715,716,721,724,730,731,732,737,739,740,742,749,755,761,767,773,774,777,782,787,792,801,802,804,806,810,811,830,837,841,843,846,848,850,853,856,869,875,878,879,880,881,885,889,897,900,905,907,920,921,930,934,953,956,966,977,986,988,991,996], + [3,11,15,20,31,33,38,48,50,56,59,60,72,75,78,88,95,96,97,103,113,125,127,130,131,132,134,142,149,153,178,185,187,195,219,222,223,247,251,252,258,261,273,277,281,292,295,304,306,308,309,319,322,326,327,357,368,376,387,390,394,414,433,435,438,447,455,473,477,488,489,490,501,509,511,517,534,537,539,545,546,557,558,566,579,585,589,600,603,606,609,616,620,621,636,638,639,645,652,670,671,679,687,703,706,707,720,722,723,724,728,733,739,744,746,747,751,752,754,757,758,764,776,781,783,785,787,789,795,797,803,805,810,811,812,815,816,829,837,847,856,858,860,862,870,881,886,890,894,895,896,900,914,924,927,932,933,935,938,939,948,970,971,973,974,975,976,982,990,1000], + [2,7,9,12,13,15,17,18,19,27,29,33,41,42,45,50,60,62,64,74,81,84,85,90,92,94,99,104,106,111,112,115,121,125,126,143,152,153,160,163,172,174,177,181,189,199,203,211,212,224,227,231,235,238,239,259,262,266,272,279,280,284,288,290,293,302,320,337,340,342,351,361,364,365,366,373,374,377,389,392,399,408,410,415,423,439,452,454,463,464,475,488,491,498,500,503,518,519,520,526,529,536,537,538,539,547,550,555,557,560,561,564,567,571,573,581,597,610,615,618,619,625,629,640,650,652,657,662,669,676,682,683,689,699,700,728,732,735,737,742,743,748,757,769,772,789,798,799,801,809,813,815,816,824,825,826,842,848,852,856,859,861,867,869,872,875,877,884,886,895,914,925,937,947,948,959,961,965,966,971,974,981,997,999], + [10,15,37,39,40,69,71,72,73,74,75,78,79,86,87,90,98,104,106,116,124,131,132,133,138,151,157,159,160,164,168,178,180,182,204,211,213,217,218,228,233,240,244,246,247,250,257,259,262,270,272,276,289,293,300,332,335,341,344,349,363,376,390,397,406,410,414,427,431,433,437,446,447,453,459,460,461,465,468,472,476,496,501,512,516,520,523,529,530,531,534,545,551,555,562,566,569,579,584,585,589,593,595,596,600,614,615,616,629,634,647,650,651,653,654,656,659,675,679,692,713,718,720,722,727,741,744,746,750,753,754,762,763,764,765,766,767,775,777,779,780,782,785,787,789,794,800,801,810,812,817,824,828,830,833,836,838,842,845,847,851,883,884,887,891,892,896,904,907,916,917,927,939,943,961,963,964,983,984,989,998,999], + [6,10,11,14,17,24,27,28,55,56,64,70,88,93,94,95,97,98,110,116,117,118,120,124,125,129,132,137,138,141,150,153,156,158,159,161,166,167,175,180,183,184,185,188,189,191,198,211,220,221,222,232,237,243,251,260,270,278,290,298,303,307,310,315,322,323,328,343,357,364,365,369,387,392,414,433,448,455,456,462,478,479,482,483,496,500,509,511,512,521,523,525,530,536,540,544,545,553,561,564,571,572,577,578,581,601,602,606,620,625,633,637,642,643,644,650,657,662,665,674,675,683,689,690,693,698,704,708,744,753,757,764,767,773,777,780,781,794,799,801,803,827,830,832,836,845,846,855,859,863,864,870,876,885,887,891,894,897,901,902,910,915,916,920,923,930,939,948,956,957,967,970,972,977,981,983,985,994], + [1,7,9,12,25,26,32,33,38,52,55,64,74,75,80,84,94,100,103,117,121,132,133,134,135,137,145,157,174,175,178,182,189,194,197,217,218,222,230,240,242,249,257,259,270,271,275,276,277,282,285,298,301,302,305,306,310,315,316,318,328,329,330,336,350,365,367,377,381,384,402,406,416,424,425,428,440,443,448,449,452,457,469,473,480,482,488,495,506,511,512,517,527,531,535,537,543,545,557,567,579,585,596,599,615,618,622,624,627,628,633,636,639,641,645,647,653,655,659,660,692,700,705,712,715,716,717,718,720,722,726,732,735,736,745,758,785,795,796,798,805,806,808,815,817,819,823,826,839,845,849,850,854,872,878,880,884,885,887,888,893,898,901,906,914,924,928,932,941,942,967,969,971,975,976,982,988,994,999], + ], + + foo: [ + std.foldl( + function(a, b) std.setInter(a, b), + sets[first+1:], + sets[first] + ) for first in std.range(0, std.length(sets) - 2) + ], +} diff --git a/bench/resources/sjsonnet_suite/setInter.jsonnet.golden b/bench/resources/sjsonnet_suite/setInter.jsonnet.golden new file mode 100644 index 00000000..247c799f --- /dev/null +++ b/bench/resources/sjsonnet_suite/setInter.jsonnet.golden @@ -0,0 +1,48 @@ +{ + "foo": [ + [ ], + [ ], + [ ], + [ ], + [ ], + [ ], + [ ], + [ + 132, + 270, + 512, + 545, + 845, + 887 + ], + [ + 55, + 64, + 94, + 117, + 132, + 137, + 175, + 189, + 222, + 270, + 298, + 310, + 315, + 328, + 365, + 448, + 482, + 511, + 512, + 545, + 633, + 845, + 885, + 887, + 901, + 967, + 994 + ] + ] +} diff --git a/bench/resources/sjsonnet_suite/setUnion.jsonnet b/bench/resources/sjsonnet_suite/setUnion.jsonnet new file mode 100644 index 00000000..be473d4d --- /dev/null +++ b/bench/resources/sjsonnet_suite/setUnion.jsonnet @@ -0,0 +1,22 @@ +{ + local sets = [ + [2,3,21,23,26,31,49,51,56,68,78,81,84,91,98,100,111,114,116,133,141,149,159,166,167,169,178,184,185,186,188,190,205,208,209,215,226,227,232,236,239,240,243,246,252,255,259,260,261,265,269,287,290,304,309,328,340,344,351,352,373,391,396,397,399,407,409,411,413,415,418,419,431,434,435,436,441,443,446,462,465,476,478,480,488,491,494,499,518,520,522,539,549,553,554,557,564,577,584,586,588,611,612,615,622,627,629,630,634,639,645,663,673,674,680,684,690,692,706,707,709,715,721,727,735,737,740,746,749,754,756,764,767,769,779,780,785,787,794,800,802,808,811,818,821,843,855,859,863,867,868,882,886,891,896,901,906,907,911,917,918,924,933,936,943,945,947,950,953,955,958,959,963,969,970,978,982,984,985,986,996], + [2,5,8,15,16,19,22,23,32,43,58,61,72,73,80,91,94,96,102,107,108,110,113,119,128,130,132,141,143,156,157,166,168,171,177,178,185,194,198,210,215,221,222,228,233,250,251,259,267,273,274,284,293,297,300,306,307,328,333,337,339,344,346,347,348,366,374,376,379,381,383,396,397,412,415,417,419,421,423,424,427,433,446,453,458,459,462,472,473,474,498,501,512,514,535,548,557,572,576,584,601,603,618,623,629,630,634,639,650,654,658,660,667,678,692,696,698,703,705,706,712,716,718,722,730,734,736,745,754,755,756,769,772,782,784,791,792,794,798,799,802,812,815,824,826,831,840,843,858,860,864,868,873,881,882,883,884,887,888,890,895,896,900,924,931,934,938,940,950,953,955,959,963,972,974,985,998], + [1,3,6,15,31,32,42,44,55,63,64,67,69,70,81,87,88,89,93,100,104,111,119,123,130,132,141,143,151,154,159,161,167,168,170,174,179,180,181,188,192,197,198,203,222,229,237,244,245,248,253,262,272,289,290,300,307,308,309,311,315,320,331,332,337,340,343,350,352,357,359,361,367,369,381,396,397,402,411,415,420,426,432,433,439,447,452,455,459,461,472,477,483,486,504,505,526,535,538,542,548,553,556,560,562,563,567,578,580,585,586,587,593,599,610,621,631,639,650,651,653,670,672,675,677,679,680,686,691,698,705,708,713,721,726,727,739,742,743,747,755,758,760,778,790,795,796,800,802,803,808,818,823,827,828,838,844,848,849,862,866,870,885,888,908,919,921,927,950,953,959,963,964,968,976,992,1000], + [1,13,16,27,35,50,53,58,65,66,67,70,71,72,73,74,88,95,96,98,99,106,112,116,119,133,134,136,139,143,155,166,170,179,183,186,187,190,193,195,203,204,211,212,225,234,235,237,238,243,248,254,261,265,267,268,277,279,293,314,334,350,351,352,354,358,364,368,371,372,376,394,405,409,410,422,433,437,439,461,463,470,473,484,492,493,511,516,528,545,550,552,554,558,561,565,588,605,613,625,626,630,631,644,653,660,664,671,686,690,692,694,696,706,714,715,717,720,721,722,723,727,738,744,745,753,755,763,771,772,776,779,784,786,788,793,794,795,798,799,801,811,816,817,838,841,844,845,857,858,865,869,872,878,888,892,894,895,896,911,915,916,921,922,934,937,940,947,951,952,955,957,958,978,982,987,997,998], + [2,7,9,21,22,24,30,37,42,52,65,67,88,89,90,132,136,140,141,142,144,152,153,156,167,171,179,181,190,193,195,196,200,209,212,231,242,246,249,253,261,277,286,295,301,304,312,319,323,328,334,341,342,346,349,351,354,364,368,369,380,382,383,384,397,413,414,415,419,421,433,434,437,448,454,465,485,486,490,499,504,506,510,517,525,526,527,539,540,543,545,553,554,561,573,574,581,588,591,594,596,605,606,608,631,639,640,645,649,650,663,694,696,697,707,709,714,715,716,721,724,730,731,732,737,739,740,742,749,755,761,767,773,774,777,782,787,792,801,802,804,806,810,811,830,837,841,843,846,848,850,853,856,869,875,878,879,880,881,885,889,897,900,905,907,920,921,930,934,953,956,966,977,986,988,991,996], + [3,11,15,20,31,33,38,48,50,56,59,60,72,75,78,88,95,96,97,103,113,125,127,130,131,132,134,142,149,153,178,185,187,195,219,222,223,247,251,252,258,261,273,277,281,292,295,304,306,308,309,319,322,326,327,357,368,376,387,390,394,414,433,435,438,447,455,473,477,488,489,490,501,509,511,517,534,537,539,545,546,557,558,566,579,585,589,600,603,606,609,616,620,621,636,638,639,645,652,670,671,679,687,703,706,707,720,722,723,724,728,733,739,744,746,747,751,752,754,757,758,764,776,781,783,785,787,789,795,797,803,805,810,811,812,815,816,829,837,847,856,858,860,862,870,881,886,890,894,895,896,900,914,924,927,932,933,935,938,939,948,970,971,973,974,975,976,982,990,1000], + [2,7,9,12,13,15,17,18,19,27,29,33,41,42,45,50,60,62,64,74,81,84,85,90,92,94,99,104,106,111,112,115,121,125,126,143,152,153,160,163,172,174,177,181,189,199,203,211,212,224,227,231,235,238,239,259,262,266,272,279,280,284,288,290,293,302,320,337,340,342,351,361,364,365,366,373,374,377,389,392,399,408,410,415,423,439,452,454,463,464,475,488,491,498,500,503,518,519,520,526,529,536,537,538,539,547,550,555,557,560,561,564,567,571,573,581,597,610,615,618,619,625,629,640,650,652,657,662,669,676,682,683,689,699,700,728,732,735,737,742,743,748,757,769,772,789,798,799,801,809,813,815,816,824,825,826,842,848,852,856,859,861,867,869,872,875,877,884,886,895,914,925,937,947,948,959,961,965,966,971,974,981,997,999], + [10,15,37,39,40,69,71,72,73,74,75,78,79,86,87,90,98,104,106,116,124,131,132,133,138,151,157,159,160,164,168,178,180,182,204,211,213,217,218,228,233,240,244,246,247,250,257,259,262,270,272,276,289,293,300,332,335,341,344,349,363,376,390,397,406,410,414,427,431,433,437,446,447,453,459,460,461,465,468,472,476,496,501,512,516,520,523,529,530,531,534,545,551,555,562,566,569,579,584,585,589,593,595,596,600,614,615,616,629,634,647,650,651,653,654,656,659,675,679,692,713,718,720,722,727,741,744,746,750,753,754,762,763,764,765,766,767,775,777,779,780,782,785,787,789,794,800,801,810,812,817,824,828,830,833,836,838,842,845,847,851,883,884,887,891,892,896,904,907,916,917,927,939,943,961,963,964,983,984,989,998,999], + [6,10,11,14,17,24,27,28,55,56,64,70,88,93,94,95,97,98,110,116,117,118,120,124,125,129,132,137,138,141,150,153,156,158,159,161,166,167,175,180,183,184,185,188,189,191,198,211,220,221,222,232,237,243,251,260,270,278,290,298,303,307,310,315,322,323,328,343,357,364,365,369,387,392,414,433,448,455,456,462,478,479,482,483,496,500,509,511,512,521,523,525,530,536,540,544,545,553,561,564,571,572,577,578,581,601,602,606,620,625,633,637,642,643,644,650,657,662,665,674,675,683,689,690,693,698,704,708,744,753,757,764,767,773,777,780,781,794,799,801,803,827,830,832,836,845,846,855,859,863,864,870,876,885,887,891,894,897,901,902,910,915,916,920,923,930,939,948,956,957,967,970,972,977,981,983,985,994], + [1,7,9,12,25,26,32,33,38,52,55,64,74,75,80,84,94,100,103,117,121,132,133,134,135,137,145,157,174,175,178,182,189,194,197,217,218,222,230,240,242,249,257,259,270,271,275,276,277,282,285,298,301,302,305,306,310,315,316,318,328,329,330,336,350,365,367,377,381,384,402,406,416,424,425,428,440,443,448,449,452,457,469,473,480,482,488,495,506,511,512,517,527,531,535,537,543,545,557,567,579,585,596,599,615,618,622,624,627,628,633,636,639,641,645,647,653,655,659,660,692,700,705,712,715,716,717,718,720,722,726,732,735,736,745,758,785,795,796,798,805,806,808,815,817,819,823,826,839,845,849,850,854,872,878,880,884,885,887,888,893,898,901,906,914,924,928,932,941,942,967,969,971,975,976,982,988,994,999], + ], + + foo: [ + std.foldl( + function(a, b) std.setUnion(a, b), + sets[first+1:], + sets[first] + ) for first in std.range(0, std.length(sets) - 2) + ], +} diff --git a/bench/resources/sjsonnet_suite/setUnion.jsonnet.golden b/bench/resources/sjsonnet_suite/setUnion.jsonnet.golden new file mode 100644 index 00000000..0d16a498 --- /dev/null +++ b/bench/resources/sjsonnet_suite/setUnion.jsonnet.golden @@ -0,0 +1,5919 @@ +{ + "foo": [ + [ + 1, + 2, + 3, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 35, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 48, + 49, + 50, + 51, + 52, + 53, + 55, + 56, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 78, + 79, + 80, + 81, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 102, + 103, + 104, + 106, + 107, + 108, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 163, + 164, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 174, + 175, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 203, + 204, + 205, + 208, + 209, + 210, + 211, + 212, + 213, + 215, + 217, + 218, + 219, + 220, + 221, + 222, + 223, + 224, + 225, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 235, + 236, + 237, + 238, + 239, + 240, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250, + 251, + 252, + 253, + 254, + 255, + 257, + 258, + 259, + 260, + 261, + 262, + 265, + 266, + 267, + 268, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 284, + 285, + 286, + 287, + 288, + 289, + 290, + 292, + 293, + 295, + 297, + 298, + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 314, + 315, + 316, + 318, + 319, + 320, + 322, + 323, + 326, + 327, + 328, + 329, + 330, + 331, + 332, + 333, + 334, + 335, + 336, + 337, + 339, + 340, + 341, + 342, + 343, + 344, + 346, + 347, + 348, + 349, + 350, + 351, + 352, + 354, + 357, + 358, + 359, + 361, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 371, + 372, + 373, + 374, + 376, + 377, + 379, + 380, + 381, + 382, + 383, + 384, + 387, + 389, + 390, + 391, + 392, + 394, + 396, + 397, + 399, + 402, + 405, + 406, + 407, + 408, + 409, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 419, + 420, + 421, + 422, + 423, + 424, + 425, + 426, + 427, + 428, + 431, + 432, + 433, + 434, + 435, + 436, + 437, + 438, + 439, + 440, + 441, + 443, + 446, + 447, + 448, + 449, + 452, + 453, + 454, + 455, + 456, + 457, + 458, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 468, + 469, + 470, + 472, + 473, + 474, + 475, + 476, + 477, + 478, + 479, + 480, + 482, + 483, + 484, + 485, + 486, + 488, + 489, + 490, + 491, + 492, + 493, + 494, + 495, + 496, + 498, + 499, + 500, + 501, + 503, + 504, + 505, + 506, + 509, + 510, + 511, + 512, + 514, + 516, + 517, + 518, + 519, + 520, + 521, + 522, + 523, + 525, + 526, + 527, + 528, + 529, + 530, + 531, + 534, + 535, + 536, + 537, + 538, + 539, + 540, + 542, + 543, + 544, + 545, + 546, + 547, + 548, + 549, + 550, + 551, + 552, + 553, + 554, + 555, + 556, + 557, + 558, + 560, + 561, + 562, + 563, + 564, + 565, + 566, + 567, + 569, + 571, + 572, + 573, + 574, + 576, + 577, + 578, + 579, + 580, + 581, + 584, + 585, + 586, + 587, + 588, + 589, + 591, + 593, + 594, + 595, + 596, + 597, + 599, + 600, + 601, + 602, + 603, + 605, + 606, + 608, + 609, + 610, + 611, + 612, + 613, + 614, + 615, + 616, + 618, + 619, + 620, + 621, + 622, + 623, + 624, + 625, + 626, + 627, + 628, + 629, + 630, + 631, + 633, + 634, + 636, + 637, + 638, + 639, + 640, + 641, + 642, + 643, + 644, + 645, + 647, + 649, + 650, + 651, + 652, + 653, + 654, + 655, + 656, + 657, + 658, + 659, + 660, + 662, + 663, + 664, + 665, + 667, + 669, + 670, + 671, + 672, + 673, + 674, + 675, + 676, + 677, + 678, + 679, + 680, + 682, + 683, + 684, + 686, + 687, + 689, + 690, + 691, + 692, + 693, + 694, + 696, + 697, + 698, + 699, + 700, + 703, + 704, + 705, + 706, + 707, + 708, + 709, + 712, + 713, + 714, + 715, + 716, + 717, + 718, + 720, + 721, + 722, + 723, + 724, + 726, + 727, + 728, + 730, + 731, + 732, + 733, + 734, + 735, + 736, + 737, + 738, + 739, + 740, + 741, + 742, + 743, + 744, + 745, + 746, + 747, + 748, + 749, + 750, + 751, + 752, + 753, + 754, + 755, + 756, + 757, + 758, + 760, + 761, + 762, + 763, + 764, + 765, + 766, + 767, + 769, + 771, + 772, + 773, + 774, + 775, + 776, + 777, + 778, + 779, + 780, + 781, + 782, + 783, + 784, + 785, + 786, + 787, + 788, + 789, + 790, + 791, + 792, + 793, + 794, + 795, + 796, + 797, + 798, + 799, + 800, + 801, + 802, + 803, + 804, + 805, + 806, + 808, + 809, + 810, + 811, + 812, + 813, + 815, + 816, + 817, + 818, + 819, + 821, + 823, + 824, + 825, + 826, + 827, + 828, + 829, + 830, + 831, + 832, + 833, + 836, + 837, + 838, + 839, + 840, + 841, + 842, + 843, + 844, + 845, + 846, + 847, + 848, + 849, + 850, + 851, + 852, + 853, + 854, + 855, + 856, + 857, + 858, + 859, + 860, + 861, + 862, + 863, + 864, + 865, + 866, + 867, + 868, + 869, + 870, + 872, + 873, + 875, + 876, + 877, + 878, + 879, + 880, + 881, + 882, + 883, + 884, + 885, + 886, + 887, + 888, + 889, + 890, + 891, + 892, + 893, + 894, + 895, + 896, + 897, + 898, + 900, + 901, + 902, + 904, + 905, + 906, + 907, + 908, + 910, + 911, + 914, + 915, + 916, + 917, + 918, + 919, + 920, + 921, + 922, + 923, + 924, + 925, + 927, + 928, + 930, + 931, + 932, + 933, + 934, + 935, + 936, + 937, + 938, + 939, + 940, + 941, + 942, + 943, + 945, + 947, + 948, + 950, + 951, + 952, + 953, + 955, + 956, + 957, + 958, + 959, + 961, + 963, + 964, + 965, + 966, + 967, + 968, + 969, + 970, + 971, + 972, + 973, + 974, + 975, + 976, + 977, + 978, + 981, + 982, + 983, + 984, + 985, + 986, + 987, + 988, + 989, + 990, + 991, + 992, + 994, + 996, + 997, + 998, + 999, + 1000 + ], + [ + 1, + 2, + 3, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 35, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 48, + 50, + 52, + 53, + 55, + 56, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 78, + 79, + 80, + 81, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 102, + 103, + 104, + 106, + 107, + 108, + 110, + 111, + 112, + 113, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 163, + 164, + 166, + 167, + 168, + 170, + 171, + 172, + 174, + 175, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 203, + 204, + 209, + 210, + 211, + 212, + 213, + 215, + 217, + 218, + 219, + 220, + 221, + 222, + 223, + 224, + 225, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 235, + 237, + 238, + 239, + 240, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250, + 251, + 252, + 253, + 254, + 257, + 258, + 259, + 260, + 261, + 262, + 265, + 266, + 267, + 268, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 284, + 285, + 286, + 288, + 289, + 290, + 292, + 293, + 295, + 297, + 298, + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 314, + 315, + 316, + 318, + 319, + 320, + 322, + 323, + 326, + 327, + 328, + 329, + 330, + 331, + 332, + 333, + 334, + 335, + 336, + 337, + 339, + 340, + 341, + 342, + 343, + 344, + 346, + 347, + 348, + 349, + 350, + 351, + 352, + 354, + 357, + 358, + 359, + 361, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 371, + 372, + 373, + 374, + 376, + 377, + 379, + 380, + 381, + 382, + 383, + 384, + 387, + 389, + 390, + 392, + 394, + 396, + 397, + 399, + 402, + 405, + 406, + 408, + 409, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 419, + 420, + 421, + 422, + 423, + 424, + 425, + 426, + 427, + 428, + 431, + 432, + 433, + 434, + 435, + 437, + 438, + 439, + 440, + 443, + 446, + 447, + 448, + 449, + 452, + 453, + 454, + 455, + 456, + 457, + 458, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 468, + 469, + 470, + 472, + 473, + 474, + 475, + 476, + 477, + 478, + 479, + 480, + 482, + 483, + 484, + 485, + 486, + 488, + 489, + 490, + 491, + 492, + 493, + 495, + 496, + 498, + 499, + 500, + 501, + 503, + 504, + 505, + 506, + 509, + 510, + 511, + 512, + 514, + 516, + 517, + 518, + 519, + 520, + 521, + 523, + 525, + 526, + 527, + 528, + 529, + 530, + 531, + 534, + 535, + 536, + 537, + 538, + 539, + 540, + 542, + 543, + 544, + 545, + 546, + 547, + 548, + 550, + 551, + 552, + 553, + 554, + 555, + 556, + 557, + 558, + 560, + 561, + 562, + 563, + 564, + 565, + 566, + 567, + 569, + 571, + 572, + 573, + 574, + 576, + 577, + 578, + 579, + 580, + 581, + 584, + 585, + 586, + 587, + 588, + 589, + 591, + 593, + 594, + 595, + 596, + 597, + 599, + 600, + 601, + 602, + 603, + 605, + 606, + 608, + 609, + 610, + 613, + 614, + 615, + 616, + 618, + 619, + 620, + 621, + 622, + 623, + 624, + 625, + 626, + 627, + 628, + 629, + 630, + 631, + 633, + 634, + 636, + 637, + 638, + 639, + 640, + 641, + 642, + 643, + 644, + 645, + 647, + 649, + 650, + 651, + 652, + 653, + 654, + 655, + 656, + 657, + 658, + 659, + 660, + 662, + 663, + 664, + 665, + 667, + 669, + 670, + 671, + 672, + 674, + 675, + 676, + 677, + 678, + 679, + 680, + 682, + 683, + 686, + 687, + 689, + 690, + 691, + 692, + 693, + 694, + 696, + 697, + 698, + 699, + 700, + 703, + 704, + 705, + 706, + 707, + 708, + 709, + 712, + 713, + 714, + 715, + 716, + 717, + 718, + 720, + 721, + 722, + 723, + 724, + 726, + 727, + 728, + 730, + 731, + 732, + 733, + 734, + 735, + 736, + 737, + 738, + 739, + 740, + 741, + 742, + 743, + 744, + 745, + 746, + 747, + 748, + 749, + 750, + 751, + 752, + 753, + 754, + 755, + 756, + 757, + 758, + 760, + 761, + 762, + 763, + 764, + 765, + 766, + 767, + 769, + 771, + 772, + 773, + 774, + 775, + 776, + 777, + 778, + 779, + 780, + 781, + 782, + 783, + 784, + 785, + 786, + 787, + 788, + 789, + 790, + 791, + 792, + 793, + 794, + 795, + 796, + 797, + 798, + 799, + 800, + 801, + 802, + 803, + 804, + 805, + 806, + 808, + 809, + 810, + 811, + 812, + 813, + 815, + 816, + 817, + 818, + 819, + 823, + 824, + 825, + 826, + 827, + 828, + 829, + 830, + 831, + 832, + 833, + 836, + 837, + 838, + 839, + 840, + 841, + 842, + 843, + 844, + 845, + 846, + 847, + 848, + 849, + 850, + 851, + 852, + 853, + 854, + 855, + 856, + 857, + 858, + 859, + 860, + 861, + 862, + 863, + 864, + 865, + 866, + 867, + 868, + 869, + 870, + 872, + 873, + 875, + 876, + 877, + 878, + 879, + 880, + 881, + 882, + 883, + 884, + 885, + 886, + 887, + 888, + 889, + 890, + 891, + 892, + 893, + 894, + 895, + 896, + 897, + 898, + 900, + 901, + 902, + 904, + 905, + 906, + 907, + 908, + 910, + 911, + 914, + 915, + 916, + 917, + 919, + 920, + 921, + 922, + 923, + 924, + 925, + 927, + 928, + 930, + 931, + 932, + 933, + 934, + 935, + 937, + 938, + 939, + 940, + 941, + 942, + 943, + 947, + 948, + 950, + 951, + 952, + 953, + 955, + 956, + 957, + 958, + 959, + 961, + 963, + 964, + 965, + 966, + 967, + 968, + 969, + 970, + 971, + 972, + 973, + 974, + 975, + 976, + 977, + 978, + 981, + 982, + 983, + 984, + 985, + 986, + 987, + 988, + 989, + 990, + 991, + 992, + 994, + 996, + 997, + 998, + 999, + 1000 + ], + [ + 1, + 2, + 3, + 6, + 7, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 35, + 37, + 38, + 39, + 40, + 41, + 42, + 44, + 45, + 48, + 50, + 52, + 53, + 55, + 56, + 58, + 59, + 60, + 62, + 63, + 64, + 65, + 66, + 67, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 78, + 79, + 80, + 81, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 103, + 104, + 106, + 110, + 111, + 112, + 113, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 123, + 124, + 125, + 126, + 127, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 163, + 164, + 166, + 167, + 168, + 170, + 171, + 172, + 174, + 175, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 203, + 204, + 209, + 211, + 212, + 213, + 217, + 218, + 219, + 220, + 221, + 222, + 223, + 224, + 225, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 235, + 237, + 238, + 239, + 240, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250, + 251, + 252, + 253, + 254, + 257, + 258, + 259, + 260, + 261, + 262, + 265, + 266, + 267, + 268, + 270, + 271, + 272, + 273, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 284, + 285, + 286, + 288, + 289, + 290, + 292, + 293, + 295, + 298, + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 314, + 315, + 316, + 318, + 319, + 320, + 322, + 323, + 326, + 327, + 328, + 329, + 330, + 331, + 332, + 334, + 335, + 336, + 337, + 340, + 341, + 342, + 343, + 344, + 346, + 349, + 350, + 351, + 352, + 354, + 357, + 358, + 359, + 361, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 371, + 372, + 373, + 374, + 376, + 377, + 380, + 381, + 382, + 383, + 384, + 387, + 389, + 390, + 392, + 394, + 396, + 397, + 399, + 402, + 405, + 406, + 408, + 409, + 410, + 411, + 413, + 414, + 415, + 416, + 419, + 420, + 421, + 422, + 423, + 424, + 425, + 426, + 427, + 428, + 431, + 432, + 433, + 434, + 435, + 437, + 438, + 439, + 440, + 443, + 446, + 447, + 448, + 449, + 452, + 453, + 454, + 455, + 456, + 457, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 468, + 469, + 470, + 472, + 473, + 475, + 476, + 477, + 478, + 479, + 480, + 482, + 483, + 484, + 485, + 486, + 488, + 489, + 490, + 491, + 492, + 493, + 495, + 496, + 498, + 499, + 500, + 501, + 503, + 504, + 505, + 506, + 509, + 510, + 511, + 512, + 516, + 517, + 518, + 519, + 520, + 521, + 523, + 525, + 526, + 527, + 528, + 529, + 530, + 531, + 534, + 535, + 536, + 537, + 538, + 539, + 540, + 542, + 543, + 544, + 545, + 546, + 547, + 548, + 550, + 551, + 552, + 553, + 554, + 555, + 556, + 557, + 558, + 560, + 561, + 562, + 563, + 564, + 565, + 566, + 567, + 569, + 571, + 572, + 573, + 574, + 577, + 578, + 579, + 580, + 581, + 584, + 585, + 586, + 587, + 588, + 589, + 591, + 593, + 594, + 595, + 596, + 597, + 599, + 600, + 601, + 602, + 603, + 605, + 606, + 608, + 609, + 610, + 613, + 614, + 615, + 616, + 618, + 619, + 620, + 621, + 622, + 624, + 625, + 626, + 627, + 628, + 629, + 630, + 631, + 633, + 634, + 636, + 637, + 638, + 639, + 640, + 641, + 642, + 643, + 644, + 645, + 647, + 649, + 650, + 651, + 652, + 653, + 654, + 655, + 656, + 657, + 659, + 660, + 662, + 663, + 664, + 665, + 669, + 670, + 671, + 672, + 674, + 675, + 676, + 677, + 679, + 680, + 682, + 683, + 686, + 687, + 689, + 690, + 691, + 692, + 693, + 694, + 696, + 697, + 698, + 699, + 700, + 703, + 704, + 705, + 706, + 707, + 708, + 709, + 712, + 713, + 714, + 715, + 716, + 717, + 718, + 720, + 721, + 722, + 723, + 724, + 726, + 727, + 728, + 730, + 731, + 732, + 733, + 735, + 736, + 737, + 738, + 739, + 740, + 741, + 742, + 743, + 744, + 745, + 746, + 747, + 748, + 749, + 750, + 751, + 752, + 753, + 754, + 755, + 757, + 758, + 760, + 761, + 762, + 763, + 764, + 765, + 766, + 767, + 769, + 771, + 772, + 773, + 774, + 775, + 776, + 777, + 778, + 779, + 780, + 781, + 782, + 783, + 784, + 785, + 786, + 787, + 788, + 789, + 790, + 792, + 793, + 794, + 795, + 796, + 797, + 798, + 799, + 800, + 801, + 802, + 803, + 804, + 805, + 806, + 808, + 809, + 810, + 811, + 812, + 813, + 815, + 816, + 817, + 818, + 819, + 823, + 824, + 825, + 826, + 827, + 828, + 829, + 830, + 832, + 833, + 836, + 837, + 838, + 839, + 841, + 842, + 843, + 844, + 845, + 846, + 847, + 848, + 849, + 850, + 851, + 852, + 853, + 854, + 855, + 856, + 857, + 858, + 859, + 860, + 861, + 862, + 863, + 864, + 865, + 866, + 867, + 869, + 870, + 872, + 875, + 876, + 877, + 878, + 879, + 880, + 881, + 883, + 884, + 885, + 886, + 887, + 888, + 889, + 890, + 891, + 892, + 893, + 894, + 895, + 896, + 897, + 898, + 900, + 901, + 902, + 904, + 905, + 906, + 907, + 908, + 910, + 911, + 914, + 915, + 916, + 917, + 919, + 920, + 921, + 922, + 923, + 924, + 925, + 927, + 928, + 930, + 932, + 933, + 934, + 935, + 937, + 938, + 939, + 940, + 941, + 942, + 943, + 947, + 948, + 950, + 951, + 952, + 953, + 955, + 956, + 957, + 958, + 959, + 961, + 963, + 964, + 965, + 966, + 967, + 968, + 969, + 970, + 971, + 972, + 973, + 974, + 975, + 976, + 977, + 978, + 981, + 982, + 983, + 984, + 985, + 986, + 987, + 988, + 989, + 990, + 991, + 992, + 994, + 996, + 997, + 998, + 999, + 1000 + ], + [ + 1, + 2, + 3, + 6, + 7, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 35, + 37, + 38, + 39, + 40, + 41, + 42, + 45, + 48, + 50, + 52, + 53, + 55, + 56, + 58, + 59, + 60, + 62, + 64, + 65, + 66, + 67, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 78, + 79, + 80, + 81, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 103, + 104, + 106, + 110, + 111, + 112, + 113, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 124, + 125, + 126, + 127, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 149, + 150, + 151, + 152, + 153, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 163, + 164, + 166, + 167, + 168, + 170, + 171, + 172, + 174, + 175, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 203, + 204, + 209, + 211, + 212, + 213, + 217, + 218, + 219, + 220, + 221, + 222, + 223, + 224, + 225, + 227, + 228, + 230, + 231, + 232, + 233, + 234, + 235, + 237, + 238, + 239, + 240, + 242, + 243, + 244, + 246, + 247, + 248, + 249, + 250, + 251, + 252, + 253, + 254, + 257, + 258, + 259, + 260, + 261, + 262, + 265, + 266, + 267, + 268, + 270, + 271, + 272, + 273, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 284, + 285, + 286, + 288, + 289, + 290, + 292, + 293, + 295, + 298, + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 312, + 314, + 315, + 316, + 318, + 319, + 320, + 322, + 323, + 326, + 327, + 328, + 329, + 330, + 332, + 334, + 335, + 336, + 337, + 340, + 341, + 342, + 343, + 344, + 346, + 349, + 350, + 351, + 352, + 354, + 357, + 358, + 361, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 371, + 372, + 373, + 374, + 376, + 377, + 380, + 381, + 382, + 383, + 384, + 387, + 389, + 390, + 392, + 394, + 397, + 399, + 402, + 405, + 406, + 408, + 409, + 410, + 413, + 414, + 415, + 416, + 419, + 421, + 422, + 423, + 424, + 425, + 427, + 428, + 431, + 433, + 434, + 435, + 437, + 438, + 439, + 440, + 443, + 446, + 447, + 448, + 449, + 452, + 453, + 454, + 455, + 456, + 457, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 468, + 469, + 470, + 472, + 473, + 475, + 476, + 477, + 478, + 479, + 480, + 482, + 483, + 484, + 485, + 486, + 488, + 489, + 490, + 491, + 492, + 493, + 495, + 496, + 498, + 499, + 500, + 501, + 503, + 504, + 506, + 509, + 510, + 511, + 512, + 516, + 517, + 518, + 519, + 520, + 521, + 523, + 525, + 526, + 527, + 528, + 529, + 530, + 531, + 534, + 535, + 536, + 537, + 538, + 539, + 540, + 543, + 544, + 545, + 546, + 547, + 550, + 551, + 552, + 553, + 554, + 555, + 557, + 558, + 560, + 561, + 562, + 564, + 565, + 566, + 567, + 569, + 571, + 572, + 573, + 574, + 577, + 578, + 579, + 581, + 584, + 585, + 588, + 589, + 591, + 593, + 594, + 595, + 596, + 597, + 599, + 600, + 601, + 602, + 603, + 605, + 606, + 608, + 609, + 610, + 613, + 614, + 615, + 616, + 618, + 619, + 620, + 621, + 622, + 624, + 625, + 626, + 627, + 628, + 629, + 630, + 631, + 633, + 634, + 636, + 637, + 638, + 639, + 640, + 641, + 642, + 643, + 644, + 645, + 647, + 649, + 650, + 651, + 652, + 653, + 654, + 655, + 656, + 657, + 659, + 660, + 662, + 663, + 664, + 665, + 669, + 670, + 671, + 674, + 675, + 676, + 679, + 682, + 683, + 686, + 687, + 689, + 690, + 692, + 693, + 694, + 696, + 697, + 698, + 699, + 700, + 703, + 704, + 705, + 706, + 707, + 708, + 709, + 712, + 713, + 714, + 715, + 716, + 717, + 718, + 720, + 721, + 722, + 723, + 724, + 726, + 727, + 728, + 730, + 731, + 732, + 733, + 735, + 736, + 737, + 738, + 739, + 740, + 741, + 742, + 743, + 744, + 745, + 746, + 747, + 748, + 749, + 750, + 751, + 752, + 753, + 754, + 755, + 757, + 758, + 761, + 762, + 763, + 764, + 765, + 766, + 767, + 769, + 771, + 772, + 773, + 774, + 775, + 776, + 777, + 779, + 780, + 781, + 782, + 783, + 784, + 785, + 786, + 787, + 788, + 789, + 792, + 793, + 794, + 795, + 796, + 797, + 798, + 799, + 800, + 801, + 802, + 803, + 804, + 805, + 806, + 808, + 809, + 810, + 811, + 812, + 813, + 815, + 816, + 817, + 819, + 823, + 824, + 825, + 826, + 827, + 828, + 829, + 830, + 832, + 833, + 836, + 837, + 838, + 839, + 841, + 842, + 843, + 844, + 845, + 846, + 847, + 848, + 849, + 850, + 851, + 852, + 853, + 854, + 855, + 856, + 857, + 858, + 859, + 860, + 861, + 862, + 863, + 864, + 865, + 867, + 869, + 870, + 872, + 875, + 876, + 877, + 878, + 879, + 880, + 881, + 883, + 884, + 885, + 886, + 887, + 888, + 889, + 890, + 891, + 892, + 893, + 894, + 895, + 896, + 897, + 898, + 900, + 901, + 902, + 904, + 905, + 906, + 907, + 910, + 911, + 914, + 915, + 916, + 917, + 920, + 921, + 922, + 923, + 924, + 925, + 927, + 928, + 930, + 932, + 933, + 934, + 935, + 937, + 938, + 939, + 940, + 941, + 942, + 943, + 947, + 948, + 951, + 952, + 953, + 955, + 956, + 957, + 958, + 959, + 961, + 963, + 964, + 965, + 966, + 967, + 969, + 970, + 971, + 972, + 973, + 974, + 975, + 976, + 977, + 978, + 981, + 982, + 983, + 984, + 985, + 986, + 987, + 988, + 989, + 990, + 991, + 994, + 996, + 997, + 998, + 999, + 1000 + ], + [ + 1, + 2, + 3, + 6, + 7, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 17, + 18, + 19, + 20, + 21, + 22, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 37, + 38, + 39, + 40, + 41, + 42, + 45, + 48, + 50, + 52, + 55, + 56, + 59, + 60, + 62, + 64, + 65, + 67, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 78, + 79, + 80, + 81, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 103, + 104, + 106, + 110, + 111, + 112, + 113, + 115, + 116, + 117, + 118, + 120, + 121, + 124, + 125, + 126, + 127, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 140, + 141, + 142, + 143, + 144, + 145, + 149, + 150, + 151, + 152, + 153, + 156, + 157, + 158, + 159, + 160, + 161, + 163, + 164, + 166, + 167, + 168, + 171, + 172, + 174, + 175, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 187, + 188, + 189, + 190, + 191, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 203, + 204, + 209, + 211, + 212, + 213, + 217, + 218, + 219, + 220, + 221, + 222, + 223, + 224, + 227, + 228, + 230, + 231, + 232, + 233, + 235, + 237, + 238, + 239, + 240, + 242, + 243, + 244, + 246, + 247, + 249, + 250, + 251, + 252, + 253, + 257, + 258, + 259, + 260, + 261, + 262, + 266, + 270, + 271, + 272, + 273, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 284, + 285, + 286, + 288, + 289, + 290, + 292, + 293, + 295, + 298, + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 312, + 315, + 316, + 318, + 319, + 320, + 322, + 323, + 326, + 327, + 328, + 329, + 330, + 332, + 334, + 335, + 336, + 337, + 340, + 341, + 342, + 343, + 344, + 346, + 349, + 350, + 351, + 354, + 357, + 361, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 373, + 374, + 376, + 377, + 380, + 381, + 382, + 383, + 384, + 387, + 389, + 390, + 392, + 394, + 397, + 399, + 402, + 406, + 408, + 410, + 413, + 414, + 415, + 416, + 419, + 421, + 423, + 424, + 425, + 427, + 428, + 431, + 433, + 434, + 435, + 437, + 438, + 439, + 440, + 443, + 446, + 447, + 448, + 449, + 452, + 453, + 454, + 455, + 456, + 457, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 468, + 469, + 472, + 473, + 475, + 476, + 477, + 478, + 479, + 480, + 482, + 483, + 485, + 486, + 488, + 489, + 490, + 491, + 495, + 496, + 498, + 499, + 500, + 501, + 503, + 504, + 506, + 509, + 510, + 511, + 512, + 516, + 517, + 518, + 519, + 520, + 521, + 523, + 525, + 526, + 527, + 529, + 530, + 531, + 534, + 535, + 536, + 537, + 538, + 539, + 540, + 543, + 544, + 545, + 546, + 547, + 550, + 551, + 553, + 554, + 555, + 557, + 558, + 560, + 561, + 562, + 564, + 566, + 567, + 569, + 571, + 572, + 573, + 574, + 577, + 578, + 579, + 581, + 584, + 585, + 588, + 589, + 591, + 593, + 594, + 595, + 596, + 597, + 599, + 600, + 601, + 602, + 603, + 605, + 606, + 608, + 609, + 610, + 614, + 615, + 616, + 618, + 619, + 620, + 621, + 622, + 624, + 625, + 627, + 628, + 629, + 631, + 633, + 634, + 636, + 637, + 638, + 639, + 640, + 641, + 642, + 643, + 644, + 645, + 647, + 649, + 650, + 651, + 652, + 653, + 654, + 655, + 656, + 657, + 659, + 660, + 662, + 663, + 665, + 669, + 670, + 671, + 674, + 675, + 676, + 679, + 682, + 683, + 687, + 689, + 690, + 692, + 693, + 694, + 696, + 697, + 698, + 699, + 700, + 703, + 704, + 705, + 706, + 707, + 708, + 709, + 712, + 713, + 714, + 715, + 716, + 717, + 718, + 720, + 721, + 722, + 723, + 724, + 726, + 727, + 728, + 730, + 731, + 732, + 733, + 735, + 736, + 737, + 739, + 740, + 741, + 742, + 743, + 744, + 745, + 746, + 747, + 748, + 749, + 750, + 751, + 752, + 753, + 754, + 755, + 757, + 758, + 761, + 762, + 763, + 764, + 765, + 766, + 767, + 769, + 772, + 773, + 774, + 775, + 776, + 777, + 779, + 780, + 781, + 782, + 783, + 785, + 787, + 789, + 792, + 794, + 795, + 796, + 797, + 798, + 799, + 800, + 801, + 802, + 803, + 804, + 805, + 806, + 808, + 809, + 810, + 811, + 812, + 813, + 815, + 816, + 817, + 819, + 823, + 824, + 825, + 826, + 827, + 828, + 829, + 830, + 832, + 833, + 836, + 837, + 838, + 839, + 841, + 842, + 843, + 845, + 846, + 847, + 848, + 849, + 850, + 851, + 852, + 853, + 854, + 855, + 856, + 858, + 859, + 860, + 861, + 862, + 863, + 864, + 867, + 869, + 870, + 872, + 875, + 876, + 877, + 878, + 879, + 880, + 881, + 883, + 884, + 885, + 886, + 887, + 888, + 889, + 890, + 891, + 892, + 893, + 894, + 895, + 896, + 897, + 898, + 900, + 901, + 902, + 904, + 905, + 906, + 907, + 910, + 914, + 915, + 916, + 917, + 920, + 921, + 923, + 924, + 925, + 927, + 928, + 930, + 932, + 933, + 934, + 935, + 937, + 938, + 939, + 941, + 942, + 943, + 947, + 948, + 953, + 956, + 957, + 959, + 961, + 963, + 964, + 965, + 966, + 967, + 969, + 970, + 971, + 972, + 973, + 974, + 975, + 976, + 977, + 981, + 982, + 983, + 984, + 985, + 986, + 988, + 989, + 990, + 991, + 994, + 996, + 997, + 998, + 999, + 1000 + ], + [ + 1, + 2, + 3, + 6, + 7, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 17, + 18, + 19, + 20, + 24, + 25, + 26, + 27, + 28, + 29, + 31, + 32, + 33, + 37, + 38, + 39, + 40, + 41, + 42, + 45, + 48, + 50, + 52, + 55, + 56, + 59, + 60, + 62, + 64, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 78, + 79, + 80, + 81, + 84, + 85, + 86, + 87, + 88, + 90, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 103, + 104, + 106, + 110, + 111, + 112, + 113, + 115, + 116, + 117, + 118, + 120, + 121, + 124, + 125, + 126, + 127, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 137, + 138, + 141, + 142, + 143, + 145, + 149, + 150, + 151, + 152, + 153, + 156, + 157, + 158, + 159, + 160, + 161, + 163, + 164, + 166, + 167, + 168, + 172, + 174, + 175, + 177, + 178, + 180, + 181, + 182, + 183, + 184, + 185, + 187, + 188, + 189, + 191, + 194, + 195, + 197, + 198, + 199, + 203, + 204, + 211, + 212, + 213, + 217, + 218, + 219, + 220, + 221, + 222, + 223, + 224, + 227, + 228, + 230, + 231, + 232, + 233, + 235, + 237, + 238, + 239, + 240, + 242, + 243, + 244, + 246, + 247, + 249, + 250, + 251, + 252, + 257, + 258, + 259, + 260, + 261, + 262, + 266, + 270, + 271, + 272, + 273, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 284, + 285, + 288, + 289, + 290, + 292, + 293, + 295, + 298, + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 315, + 316, + 318, + 319, + 320, + 322, + 323, + 326, + 327, + 328, + 329, + 330, + 332, + 335, + 336, + 337, + 340, + 341, + 342, + 343, + 344, + 349, + 350, + 351, + 357, + 361, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 373, + 374, + 376, + 377, + 381, + 384, + 387, + 389, + 390, + 392, + 394, + 397, + 399, + 402, + 406, + 408, + 410, + 414, + 415, + 416, + 423, + 424, + 425, + 427, + 428, + 431, + 433, + 435, + 437, + 438, + 439, + 440, + 443, + 446, + 447, + 448, + 449, + 452, + 453, + 454, + 455, + 456, + 457, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 468, + 469, + 472, + 473, + 475, + 476, + 477, + 478, + 479, + 480, + 482, + 483, + 488, + 489, + 490, + 491, + 495, + 496, + 498, + 500, + 501, + 503, + 506, + 509, + 511, + 512, + 516, + 517, + 518, + 519, + 520, + 521, + 523, + 525, + 526, + 527, + 529, + 530, + 531, + 534, + 535, + 536, + 537, + 538, + 539, + 540, + 543, + 544, + 545, + 546, + 547, + 550, + 551, + 553, + 555, + 557, + 558, + 560, + 561, + 562, + 564, + 566, + 567, + 569, + 571, + 572, + 573, + 577, + 578, + 579, + 581, + 584, + 585, + 589, + 593, + 595, + 596, + 597, + 599, + 600, + 601, + 602, + 603, + 606, + 609, + 610, + 614, + 615, + 616, + 618, + 619, + 620, + 621, + 622, + 624, + 625, + 627, + 628, + 629, + 633, + 634, + 636, + 637, + 638, + 639, + 640, + 641, + 642, + 643, + 644, + 645, + 647, + 650, + 651, + 652, + 653, + 654, + 655, + 656, + 657, + 659, + 660, + 662, + 665, + 669, + 670, + 671, + 674, + 675, + 676, + 679, + 682, + 683, + 687, + 689, + 690, + 692, + 693, + 698, + 699, + 700, + 703, + 704, + 705, + 706, + 707, + 708, + 712, + 713, + 715, + 716, + 717, + 718, + 720, + 722, + 723, + 724, + 726, + 727, + 728, + 732, + 733, + 735, + 736, + 737, + 739, + 741, + 742, + 743, + 744, + 745, + 746, + 747, + 748, + 750, + 751, + 752, + 753, + 754, + 757, + 758, + 762, + 763, + 764, + 765, + 766, + 767, + 769, + 772, + 773, + 775, + 776, + 777, + 779, + 780, + 781, + 782, + 783, + 785, + 787, + 789, + 794, + 795, + 796, + 797, + 798, + 799, + 800, + 801, + 803, + 805, + 806, + 808, + 809, + 810, + 811, + 812, + 813, + 815, + 816, + 817, + 819, + 823, + 824, + 825, + 826, + 827, + 828, + 829, + 830, + 832, + 833, + 836, + 837, + 838, + 839, + 842, + 845, + 846, + 847, + 848, + 849, + 850, + 851, + 852, + 854, + 855, + 856, + 858, + 859, + 860, + 861, + 862, + 863, + 864, + 867, + 869, + 870, + 872, + 875, + 876, + 877, + 878, + 880, + 881, + 883, + 884, + 885, + 886, + 887, + 888, + 890, + 891, + 892, + 893, + 894, + 895, + 896, + 897, + 898, + 900, + 901, + 902, + 904, + 906, + 907, + 910, + 914, + 915, + 916, + 917, + 920, + 923, + 924, + 925, + 927, + 928, + 930, + 932, + 933, + 935, + 937, + 938, + 939, + 941, + 942, + 943, + 947, + 948, + 956, + 957, + 959, + 961, + 963, + 964, + 965, + 966, + 967, + 969, + 970, + 971, + 972, + 973, + 974, + 975, + 976, + 977, + 981, + 982, + 983, + 984, + 985, + 988, + 989, + 990, + 994, + 997, + 998, + 999, + 1000 + ], + [ + 1, + 2, + 6, + 7, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 17, + 18, + 19, + 24, + 25, + 26, + 27, + 28, + 29, + 32, + 33, + 37, + 38, + 39, + 40, + 41, + 42, + 45, + 50, + 52, + 55, + 56, + 60, + 62, + 64, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 78, + 79, + 80, + 81, + 84, + 85, + 86, + 87, + 88, + 90, + 92, + 93, + 94, + 95, + 97, + 98, + 99, + 100, + 103, + 104, + 106, + 110, + 111, + 112, + 115, + 116, + 117, + 118, + 120, + 121, + 124, + 125, + 126, + 129, + 131, + 132, + 133, + 134, + 135, + 137, + 138, + 141, + 143, + 145, + 150, + 151, + 152, + 153, + 156, + 157, + 158, + 159, + 160, + 161, + 163, + 164, + 166, + 167, + 168, + 172, + 174, + 175, + 177, + 178, + 180, + 181, + 182, + 183, + 184, + 185, + 188, + 189, + 191, + 194, + 197, + 198, + 199, + 203, + 204, + 211, + 212, + 213, + 217, + 218, + 220, + 221, + 222, + 224, + 227, + 228, + 230, + 231, + 232, + 233, + 235, + 237, + 238, + 239, + 240, + 242, + 243, + 244, + 246, + 247, + 249, + 250, + 251, + 257, + 259, + 260, + 262, + 266, + 270, + 271, + 272, + 275, + 276, + 277, + 278, + 279, + 280, + 282, + 284, + 285, + 288, + 289, + 290, + 293, + 298, + 300, + 301, + 302, + 303, + 305, + 306, + 307, + 310, + 315, + 316, + 318, + 320, + 322, + 323, + 328, + 329, + 330, + 332, + 335, + 336, + 337, + 340, + 341, + 342, + 343, + 344, + 349, + 350, + 351, + 357, + 361, + 363, + 364, + 365, + 366, + 367, + 369, + 373, + 374, + 376, + 377, + 381, + 384, + 387, + 389, + 390, + 392, + 397, + 399, + 402, + 406, + 408, + 410, + 414, + 415, + 416, + 423, + 424, + 425, + 427, + 428, + 431, + 433, + 437, + 439, + 440, + 443, + 446, + 447, + 448, + 449, + 452, + 453, + 454, + 455, + 456, + 457, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 468, + 469, + 472, + 473, + 475, + 476, + 478, + 479, + 480, + 482, + 483, + 488, + 491, + 495, + 496, + 498, + 500, + 501, + 503, + 506, + 509, + 511, + 512, + 516, + 517, + 518, + 519, + 520, + 521, + 523, + 525, + 526, + 527, + 529, + 530, + 531, + 534, + 535, + 536, + 537, + 538, + 539, + 540, + 543, + 544, + 545, + 547, + 550, + 551, + 553, + 555, + 557, + 560, + 561, + 562, + 564, + 566, + 567, + 569, + 571, + 572, + 573, + 577, + 578, + 579, + 581, + 584, + 585, + 589, + 593, + 595, + 596, + 597, + 599, + 600, + 601, + 602, + 606, + 610, + 614, + 615, + 616, + 618, + 619, + 620, + 622, + 624, + 625, + 627, + 628, + 629, + 633, + 634, + 636, + 637, + 639, + 640, + 641, + 642, + 643, + 644, + 645, + 647, + 650, + 651, + 652, + 653, + 654, + 655, + 656, + 657, + 659, + 660, + 662, + 665, + 669, + 674, + 675, + 676, + 679, + 682, + 683, + 689, + 690, + 692, + 693, + 698, + 699, + 700, + 704, + 705, + 708, + 712, + 713, + 715, + 716, + 717, + 718, + 720, + 722, + 726, + 727, + 728, + 732, + 735, + 736, + 737, + 741, + 742, + 743, + 744, + 745, + 746, + 748, + 750, + 753, + 754, + 757, + 758, + 762, + 763, + 764, + 765, + 766, + 767, + 769, + 772, + 773, + 775, + 777, + 779, + 780, + 781, + 782, + 785, + 787, + 789, + 794, + 795, + 796, + 798, + 799, + 800, + 801, + 803, + 805, + 806, + 808, + 809, + 810, + 812, + 813, + 815, + 816, + 817, + 819, + 823, + 824, + 825, + 826, + 827, + 828, + 830, + 832, + 833, + 836, + 838, + 839, + 842, + 845, + 846, + 847, + 848, + 849, + 850, + 851, + 852, + 854, + 855, + 856, + 859, + 861, + 863, + 864, + 867, + 869, + 870, + 872, + 875, + 876, + 877, + 878, + 880, + 883, + 884, + 885, + 886, + 887, + 888, + 891, + 892, + 893, + 894, + 895, + 896, + 897, + 898, + 901, + 902, + 904, + 906, + 907, + 910, + 914, + 915, + 916, + 917, + 920, + 923, + 924, + 925, + 927, + 928, + 930, + 932, + 937, + 939, + 941, + 942, + 943, + 947, + 948, + 956, + 957, + 959, + 961, + 963, + 964, + 965, + 966, + 967, + 969, + 970, + 971, + 972, + 974, + 975, + 976, + 977, + 981, + 982, + 983, + 984, + 985, + 988, + 989, + 994, + 997, + 998, + 999 + ], + [ + 1, + 6, + 7, + 9, + 10, + 11, + 12, + 14, + 15, + 17, + 24, + 25, + 26, + 27, + 28, + 32, + 33, + 37, + 38, + 39, + 40, + 52, + 55, + 56, + 64, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 78, + 79, + 80, + 84, + 86, + 87, + 88, + 90, + 93, + 94, + 95, + 97, + 98, + 100, + 103, + 104, + 106, + 110, + 116, + 117, + 118, + 120, + 121, + 124, + 125, + 129, + 131, + 132, + 133, + 134, + 135, + 137, + 138, + 141, + 145, + 150, + 151, + 153, + 156, + 157, + 158, + 159, + 160, + 161, + 164, + 166, + 167, + 168, + 174, + 175, + 178, + 180, + 182, + 183, + 184, + 185, + 188, + 189, + 191, + 194, + 197, + 198, + 204, + 211, + 213, + 217, + 218, + 220, + 221, + 222, + 228, + 230, + 232, + 233, + 237, + 240, + 242, + 243, + 244, + 246, + 247, + 249, + 250, + 251, + 257, + 259, + 260, + 262, + 270, + 271, + 272, + 275, + 276, + 277, + 278, + 282, + 285, + 289, + 290, + 293, + 298, + 300, + 301, + 302, + 303, + 305, + 306, + 307, + 310, + 315, + 316, + 318, + 322, + 323, + 328, + 329, + 330, + 332, + 335, + 336, + 341, + 343, + 344, + 349, + 350, + 357, + 363, + 364, + 365, + 367, + 369, + 376, + 377, + 381, + 384, + 387, + 390, + 392, + 397, + 402, + 406, + 410, + 414, + 416, + 424, + 425, + 427, + 428, + 431, + 433, + 437, + 440, + 443, + 446, + 447, + 448, + 449, + 452, + 453, + 455, + 456, + 457, + 459, + 460, + 461, + 462, + 465, + 468, + 469, + 472, + 473, + 476, + 478, + 479, + 480, + 482, + 483, + 488, + 495, + 496, + 500, + 501, + 506, + 509, + 511, + 512, + 516, + 517, + 520, + 521, + 523, + 525, + 527, + 529, + 530, + 531, + 534, + 535, + 536, + 537, + 540, + 543, + 544, + 545, + 551, + 553, + 555, + 557, + 561, + 562, + 564, + 566, + 567, + 569, + 571, + 572, + 577, + 578, + 579, + 581, + 584, + 585, + 589, + 593, + 595, + 596, + 599, + 600, + 601, + 602, + 606, + 614, + 615, + 616, + 618, + 620, + 622, + 624, + 625, + 627, + 628, + 629, + 633, + 634, + 636, + 637, + 639, + 641, + 642, + 643, + 644, + 645, + 647, + 650, + 651, + 653, + 654, + 655, + 656, + 657, + 659, + 660, + 662, + 665, + 674, + 675, + 679, + 683, + 689, + 690, + 692, + 693, + 698, + 700, + 704, + 705, + 708, + 712, + 713, + 715, + 716, + 717, + 718, + 720, + 722, + 726, + 727, + 732, + 735, + 736, + 741, + 744, + 745, + 746, + 750, + 753, + 754, + 757, + 758, + 762, + 763, + 764, + 765, + 766, + 767, + 773, + 775, + 777, + 779, + 780, + 781, + 782, + 785, + 787, + 789, + 794, + 795, + 796, + 798, + 799, + 800, + 801, + 803, + 805, + 806, + 808, + 810, + 812, + 815, + 817, + 819, + 823, + 824, + 826, + 827, + 828, + 830, + 832, + 833, + 836, + 838, + 839, + 842, + 845, + 846, + 847, + 849, + 850, + 851, + 854, + 855, + 859, + 863, + 864, + 870, + 872, + 876, + 878, + 880, + 883, + 884, + 885, + 887, + 888, + 891, + 892, + 893, + 894, + 896, + 897, + 898, + 901, + 902, + 904, + 906, + 907, + 910, + 914, + 915, + 916, + 917, + 920, + 923, + 924, + 927, + 928, + 930, + 932, + 939, + 941, + 942, + 943, + 948, + 956, + 957, + 961, + 963, + 964, + 967, + 969, + 970, + 971, + 972, + 975, + 976, + 977, + 981, + 982, + 983, + 984, + 985, + 988, + 989, + 994, + 998, + 999 + ], + [ + 1, + 6, + 7, + 9, + 10, + 11, + 12, + 14, + 17, + 24, + 25, + 26, + 27, + 28, + 32, + 33, + 38, + 52, + 55, + 56, + 64, + 70, + 74, + 75, + 80, + 84, + 88, + 93, + 94, + 95, + 97, + 98, + 100, + 103, + 110, + 116, + 117, + 118, + 120, + 121, + 124, + 125, + 129, + 132, + 133, + 134, + 135, + 137, + 138, + 141, + 145, + 150, + 153, + 156, + 157, + 158, + 159, + 161, + 166, + 167, + 174, + 175, + 178, + 180, + 182, + 183, + 184, + 185, + 188, + 189, + 191, + 194, + 197, + 198, + 211, + 217, + 218, + 220, + 221, + 222, + 230, + 232, + 237, + 240, + 242, + 243, + 249, + 251, + 257, + 259, + 260, + 270, + 271, + 275, + 276, + 277, + 278, + 282, + 285, + 290, + 298, + 301, + 302, + 303, + 305, + 306, + 307, + 310, + 315, + 316, + 318, + 322, + 323, + 328, + 329, + 330, + 336, + 343, + 350, + 357, + 364, + 365, + 367, + 369, + 377, + 381, + 384, + 387, + 392, + 402, + 406, + 414, + 416, + 424, + 425, + 428, + 433, + 440, + 443, + 448, + 449, + 452, + 455, + 456, + 457, + 462, + 469, + 473, + 478, + 479, + 480, + 482, + 483, + 488, + 495, + 496, + 500, + 506, + 509, + 511, + 512, + 517, + 521, + 523, + 525, + 527, + 530, + 531, + 535, + 536, + 537, + 540, + 543, + 544, + 545, + 553, + 557, + 561, + 564, + 567, + 571, + 572, + 577, + 578, + 579, + 581, + 585, + 596, + 599, + 601, + 602, + 606, + 615, + 618, + 620, + 622, + 624, + 625, + 627, + 628, + 633, + 636, + 637, + 639, + 641, + 642, + 643, + 644, + 645, + 647, + 650, + 653, + 655, + 657, + 659, + 660, + 662, + 665, + 674, + 675, + 683, + 689, + 690, + 692, + 693, + 698, + 700, + 704, + 705, + 708, + 712, + 715, + 716, + 717, + 718, + 720, + 722, + 726, + 732, + 735, + 736, + 744, + 745, + 753, + 757, + 758, + 764, + 767, + 773, + 777, + 780, + 781, + 785, + 794, + 795, + 796, + 798, + 799, + 801, + 803, + 805, + 806, + 808, + 815, + 817, + 819, + 823, + 826, + 827, + 830, + 832, + 836, + 839, + 845, + 846, + 849, + 850, + 854, + 855, + 859, + 863, + 864, + 870, + 872, + 876, + 878, + 880, + 884, + 885, + 887, + 888, + 891, + 893, + 894, + 897, + 898, + 901, + 902, + 906, + 910, + 914, + 915, + 916, + 920, + 923, + 924, + 928, + 930, + 932, + 939, + 941, + 942, + 948, + 956, + 957, + 967, + 969, + 970, + 971, + 972, + 975, + 976, + 977, + 981, + 982, + 983, + 985, + 988, + 994, + 999 + ] + ] +} diff --git a/sjsonnet/src/sjsonnet/stdlib/SetModule.scala b/sjsonnet/src/sjsonnet/stdlib/SetModule.scala index 65f4a364..518f1725 100644 --- a/sjsonnet/src/sjsonnet/stdlib/SetModule.scala +++ b/sjsonnet/src/sjsonnet/stdlib/SetModule.scala @@ -17,6 +17,14 @@ object SetModule extends AbstractFunctionModule { } } + private def applyKeyFunc(elem: Val, keyF: Val, pos: Position, ev: EvalScope): Val = { + keyF match { + case keyFFunc: Val.Func => + keyFFunc.apply1(elem, pos.noOffset)(ev, TailstrictModeDisabled).force + case _ => elem + } + } + private def toArrOrString(arg: Val, pos: Position, ev: EvalScope) = { arg match { case arr: Val.Arr => arr.asLazyArray @@ -40,18 +48,11 @@ object SetModule extends AbstractFunctionModule { keyF: Val, arr: mutable.IndexedSeq[? <: Lazy], toFind: Val): Boolean = { - val appliedX = keyF match { - case keyFFunc: Val.Func => keyFFunc.apply1(toFind, pos.noOffset)(ev, TailstrictModeDisabled) - case _ => toFind - } + val appliedX = applyKeyFunc(toFind, keyF, pos, ev) arr - .search(appliedX.force)((toFind: Lazy, value: Lazy) => { - val appliedValue = keyF match { - case keyFFunc: Val.Func => - keyFFunc.apply1(value, pos.noOffset)(ev, TailstrictModeDisabled) - case _ => value - } - ev.compare(toFind.force, appliedValue.force) + .search(appliedX)((toFind: Lazy, value: Lazy) => { + val appliedValue = applyKeyFunc(value.force, keyF, pos, ev) + ev.compare(toFind.force, appliedValue) }) .isInstanceOf[Found] } @@ -171,15 +172,59 @@ object SetModule extends AbstractFunctionModule { }, builtinWithDefaults("setUnion", "a" -> null, "b" -> null, "keyF" -> Val.False(dummyPos)) { (args, pos, ev) => + val keyF = args(2) + validateSet(ev, pos, keyF, args(0)) + validateSet(ev, pos, keyF, args(1)) + val a = toArrOrString(args(0), pos, ev) val b = toArrOrString(args(1), pos, ev) + if (a.isEmpty) { - uniqArr(pos, ev, sortArr(pos, ev, args(1), args(2)), args(2)) + args(1) } else if (b.isEmpty) { - uniqArr(pos, ev, sortArr(pos, ev, args(0), args(2)), args(2)) + args(0) } else { - val concat = Val.Arr(pos, a ++ b) - uniqArr(pos, ev, sortArr(pos, ev, concat, args(2)), args(2)) + val out = new mutable.ArrayBuilder.ofRef[Lazy] + out.sizeHint(a.length + b.length) + + var idxA = 0 + var idxB = 0 + + while (idxA < a.length && idxB < b.length) { + val elemA = a(idxA).force + val elemB = b(idxB).force + + val keyA = applyKeyFunc(elemA, keyF, pos, ev) + val keyB = applyKeyFunc(elemB, keyF, pos, ev) + + val cmp = ev.compare(keyA, keyB) + if (cmp < 0) { + // keyA < keyB, take from a + out.+=(a(idxA)) + idxA += 1 + } else if (cmp > 0) { + // keyA > keyB, take from b + out.+=(b(idxB)) + idxB += 1 + } else { + // keyA == keyB, take one and skip duplicate + out.+=(a(idxA)) + idxA += 1 + idxB += 1 + } + } + + // Add remaining elements from a or b + while (idxA < a.length) { + out.+=(a(idxA)) + idxA += 1 + } + while (idxB < b.length) { + out.+=(b(idxB)) + idxB += 1 + } + + Val.Arr(pos, out.result()) } }, builtinWithDefaults("setInter", "a" -> null, "b" -> null, "keyF" -> Val.False(dummyPos)) { @@ -195,13 +240,31 @@ object SetModule extends AbstractFunctionModule { // Set a reasonable size hint - intersection will be at most the size of the smaller set out.sizeHint(math.min(a.length, b.length)) - // The intersection will always be, at most, the size of the smallest set. - val sets = if (b.length < a.length) (b, a) else (a, b) - for (v <- sets._1) { - if (existsInSet(ev, pos, keyF, sets._2, v.force)) { - out.+=(v) + var idxA = 0 + var idxB = 0 + + while (idxA < a.length && idxB < b.length) { + val elemA = a(idxA).force + val elemB = b(idxB).force + + val keyA = applyKeyFunc(elemA, keyF, pos, ev) + val keyB = applyKeyFunc(elemB, keyF, pos, ev) + + val cmp = ev.compare(keyA, keyB) + if (cmp < 0) { + // keyA < keyB, elemA not in intersection + idxA += 1 + } else if (cmp > 0) { + // keyA > keyB, elemB not in intersection + idxB += 1 + } else { + // keyA == keyB, found intersection element + out.+=(a(idxA)) + idxA += 1 + idxB += 1 } } + Val.Arr(pos, out.result()) }, builtinWithDefaults("setDiff", "a" -> null, "b" -> null, "keyF" -> Val.False(dummyPos)) { @@ -216,11 +279,40 @@ object SetModule extends AbstractFunctionModule { // Set a reasonable size hint - difference will be at most the size of the first set out.sizeHint(a.length) - for (v <- a) { - if (!existsInSet(ev, pos, keyF, b, v.force)) { - out.+=(v) + var idxA = 0 + var idxB = 0 + + while (idxA < a.length) { + val elemA = a(idxA).force + val keyA = applyKeyFunc(elemA, keyF, pos, ev) + + // Advance idxB to find first element >= keyA + var foundEqual = false + var continue = true + while (idxB < b.length && continue) { + val elemB = b(idxB).force + val keyB = applyKeyFunc(elemB, keyF, pos, ev) + + val cmp = ev.compare(keyA, keyB) + if (cmp <= 0) { + // keyA <= keyB, found position + foundEqual = (cmp == 0) + if (foundEqual) idxB += 1 // Move past the match + continue = false + } else { + // keyA > keyB, keep advancing in b + idxB += 1 + } } + + // Add elemA if we didn't find it in b + if (!foundEqual) { + out.+=(a(idxA)) + } + + idxA += 1 } + Val.Arr(pos, out.result()) }, builtinWithDefaults("setMember", "x" -> null, "arr" -> null, "keyF" -> Val.False(dummyPos)) {