@@ -71,6 +71,7 @@ const Symbols = struct {
7171 transform_items : Symbol ,
7272 fold_items : Symbol ,
7373 score_with : Symbol ,
74+ score_pairs : Symbol ,
7475 walk_rows : Symbol ,
7576 walk_cols : Symbol ,
7677 describe_try : Symbol ,
@@ -158,6 +159,7 @@ pub fn generate(self: *Self) std.mem.Allocator.Error!void {
158159 .transform_items = self .fresh (.function ),
159160 .fold_items = self .fresh (.function ),
160161 .score_with = self .fresh (.function ),
162+ .score_pairs = self .fresh (.function ),
161163 .walk_rows = self .fresh (.function ),
162164 .walk_cols = self .fresh (.function ),
163165 .describe_try = self .fresh (.function ),
@@ -467,6 +469,7 @@ fn writeTopLevelFunctions(self: *Self) std.mem.Allocator.Error!void {
467469 try self .writeCollectItems ();
468470 try self .writeItemTransforms ();
469471 try self .writeHigherOrderScoring ();
472+ try self .writeTupleScoring ();
470473 try self .writeGridRecursion ();
471474 try self .writeDescribeTry ();
472475 try self .writeTreeScoring ();
@@ -893,6 +896,63 @@ fn writeHigherOrderScoring(self: *Self) std.mem.Allocator.Error!void {
893896 try self .writeAppText ("))\n\n " );
894897}
895898
899+ fn writeTupleScoring (self : * Self ) std.mem.Allocator.Error ! void {
900+ const items = self .fresh (.value );
901+ const seed = self .fresh (.value );
902+ const pairs = self .fresh (.value );
903+ const map_item = self .fresh (.value );
904+ const acc = self .fresh (.value );
905+ const pair_id = self .fresh (.value );
906+ const pair_text = self .fresh (.value );
907+
908+ try self .writeAppSymbol (self .symbols .score_pairs );
909+ try self .writeAppText (" : List(" );
910+ try self .writeAppSymbol (self .symbols .item_type );
911+ try self .writeAppText ("), U64 -> U64\n " );
912+ try self .writeAppSymbol (self .symbols .score_pairs );
913+ try self .writeAppText (" = |" );
914+ try self .writeAppSymbol (items );
915+ try self .writeAppText (", " );
916+ try self .writeAppSymbol (seed );
917+ try self .writeAppText ("| {\n " );
918+ try self .writeIndent (1 );
919+ try self .writeAppSymbol (pairs );
920+ try self .writeAppText (" : List((U64, Str))\n " );
921+ try self .writeIndent (1 );
922+ try self .writeAppSymbol (pairs );
923+ try self .writeAppText (" = List.map(" );
924+ try self .writeAppSymbol (items );
925+ try self .writeAppText (", |" );
926+ try self .writeAppSymbol (map_item );
927+ try self .writeAppText ("| (" );
928+ try self .writeAppSymbol (map_item );
929+ try self .writeAppText ("." );
930+ try self .writeAppSymbol (self .symbols .item_id );
931+ try self .writeAppText (", " );
932+ try self .writeAppSymbol (map_item );
933+ try self .writeAppText ("." );
934+ try self .writeAppSymbol (self .symbols .item_text );
935+ try self .writeAppText ("))\n " );
936+ try self .writeIndent (1 );
937+ try self .writeAppText ("List.fold(" );
938+ try self .writeAppSymbol (pairs );
939+ try self .writeAppText (", " );
940+ try self .writeAppSymbol (seed );
941+ try self .writeAppText (", |" );
942+ try self .writeAppSymbol (acc );
943+ try self .writeAppText (", (" );
944+ try self .writeAppSymbol (pair_id );
945+ try self .writeAppText (", " );
946+ try self .writeAppSymbol (pair_text );
947+ try self .writeAppText (")| " );
948+ try self .writeAppSymbol (acc );
949+ try self .writeAppText (" + " );
950+ try self .writeAppSymbol (pair_id );
951+ try self .writeAppText (" + List.len(Str.to_utf8(" );
952+ try self .writeAppSymbol (pair_text );
953+ try self .writeAppText (")))\n }\n\n " );
954+ }
955+
896956fn writeGridRecursion (self : * Self ) std.mem.Allocator.Error ! void {
897957 const row_state = self .fresh (.value );
898958 const row = self .fresh (.value );
@@ -1118,6 +1178,7 @@ fn writeEntryPoint(self: *Self) std.mem.Allocator.Error!void {
11181178 const collected = self .fresh (.value );
11191179 const transformed = self .fresh (.value );
11201180 const folded = self .fresh (.value );
1181+ const pair_score = self .fresh (.value );
11211182 const builder = self .fresh (.value );
11221183 const state = self .fresh (.value );
11231184 const tree = self .fresh (.value );
@@ -1223,6 +1284,19 @@ fn writeEntryPoint(self: *Self) std.mem.Allocator.Error!void {
12231284 try self .writeAppSymbol (transformed );
12241285 try self .writeAppText (", 0)\n " );
12251286
1287+ try self .writeIndent (1 );
1288+ try self .writeAppSymbol (pair_score );
1289+ try self .writeAppText (" : U64\n " );
1290+ try self .writeIndent (1 );
1291+ try self .writeAppSymbol (pair_score );
1292+ try self .writeAppText (" = " );
1293+ try self .writeAppSymbol (self .symbols .score_pairs );
1294+ try self .writeAppText ("(" );
1295+ try self .writeAppSymbol (transformed );
1296+ try self .writeAppText (", " );
1297+ try self .writeAppSymbol (folded );
1298+ try self .writeAppText (")\n " );
1299+
12261300 try self .writeIndent (1 );
12271301 try self .writeAppSymbol (builder );
12281302 try self .writeAppText (" : " );
@@ -1285,6 +1359,8 @@ fn writeEntryPoint(self: *Self) std.mem.Allocator.Error!void {
12851359 try self .writeAppText (" + " );
12861360 try self .writeAppSymbol (folded );
12871361 try self .writeAppText (" + " );
1362+ try self .writeAppSymbol (pair_score );
1363+ try self .writeAppText (" + " );
12881364 try self .writeAppSymbol (tree_score );
12891365 try self .writeAppText (", 0)\n " );
12901366
@@ -1302,6 +1378,8 @@ fn writeEntryPoint(self: *Self) std.mem.Allocator.Error!void {
13021378 try self .writeAppText (", 0) + " );
13031379 try self .writeAppSymbol (folded );
13041380 try self .writeAppText (" + " );
1381+ try self .writeAppSymbol (pair_score );
1382+ try self .writeAppText (" + " );
13051383 try self .writeAppSymbol (tree_score );
13061384 try self .writeAppText (" + " );
13071385 try self .writeAppSymbol (captured_score );
0 commit comments