@@ -806,9 +806,7 @@ impl Compiler {
806
806
Node :: from_iter ( repeat_n ( Node :: Prim ( Dup , span) , n - 1 ) )
807
807
} ;
808
808
if side. side == SubSide :: Right && n < sig. args ( ) {
809
- for _ in 0 ..sig. args ( ) - n {
810
- dups = Node :: Mod ( Dip , eco_vec ! [ dups. sig_node( ) . unwrap( ) ] , span) ;
811
- }
809
+ dups = dups. sig_node ( ) . unwrap ( ) . dipped ( sig. args ( ) - n, span) . node ;
812
810
}
813
811
node. prepend ( dups) ;
814
812
return Ok ( Some ( node) ) ;
@@ -840,9 +838,9 @@ impl Compiler {
840
838
let span = self . add_span ( modified. modifier . span . clone ( ) ) ;
841
839
let mut flip = Node :: Prim ( Flip , span) ;
842
840
if side. value == SubSide :: Right {
843
- for _ in 0 ..sig . args ( ) . saturating_sub ( 2 ) {
844
- flip = Node :: Mod ( Dip , eco_vec ! [ flip . sig_node ( ) . unwrap ( ) ] , span) ;
845
- }
841
+ flip = ( flip . sig_node ( ) . unwrap ( ) )
842
+ . dipped ( sig . args ( ) . saturating_sub ( 2 ) , span)
843
+ . node ;
846
844
}
847
845
node. prepend ( flip) ;
848
846
} else {
@@ -1127,14 +1125,9 @@ impl Compiler {
1127
1125
if tried. sig . args ( ) + 1 < handler. sig . args ( ) {
1128
1126
// Tried must pop arguments that are only for the handler
1129
1127
let arg_diff = handler. sig . args ( ) - tried. sig . args ( ) - 1 ;
1130
- let mut pre =
1131
- SigNode :: new ( ( arg_diff, 0 ) , eco_vec ! [ Node :: Prim ( Pop , span) ; arg_diff] ) ;
1132
- for _ in 0 ..tried. sig . args ( ) {
1133
- pre = SigNode :: new (
1134
- ( pre. sig . args ( ) + 1 , pre. sig . outputs ( ) + 1 ) ,
1135
- Node :: Mod ( Dip , eco_vec ! [ pre] , span) ,
1136
- ) ;
1137
- }
1128
+ let pre =
1129
+ SigNode :: new ( ( arg_diff, 0 ) , eco_vec ! [ Node :: Prim ( Pop , span) ; arg_diff] )
1130
+ . dipped ( tried. sig . args ( ) , span) ;
1138
1131
tried. sig . update_args ( |a| a + arg_diff) ;
1139
1132
tried. node . prepend ( pre. node ) ;
1140
1133
} else if tried. sig . outputs ( ) < handler. sig . outputs ( ) {
@@ -1149,16 +1142,11 @@ impl Compiler {
1149
1142
let diff_diff = arg_diff. saturating_sub ( output_diff) ;
1150
1143
if diff_diff > 0 {
1151
1144
// Handler must pop arguments that are only for the tried
1152
- let mut pre = SigNode :: new (
1145
+ let pre = SigNode :: new (
1153
1146
( diff_diff, 0 ) ,
1154
1147
eco_vec ! [ Node :: Prim ( Pop , span) ; diff_diff] ,
1155
- ) ;
1156
- for _ in 0 ..handler. sig . args ( ) + arg_diff - diff_diff {
1157
- pre = SigNode :: new (
1158
- ( pre. sig . args ( ) + 1 , pre. sig . outputs ( ) + 1 ) ,
1159
- Node :: Mod ( Dip , eco_vec ! [ pre] , span) ,
1160
- ) ;
1161
- }
1148
+ )
1149
+ . dipped ( handler. sig . args ( ) + arg_diff - diff_diff, span) ;
1162
1150
( handler. sig )
1163
1151
. update_args_outputs ( |a, o| ( a + arg_diff, o + output_diff) ) ;
1164
1152
handler. node . prepend ( pre. node ) ;
@@ -1292,15 +1280,11 @@ impl Compiler {
1292
1280
0 => Node :: empty ( ) ,
1293
1281
1 => Node :: Prim ( Fix , sub_span) ,
1294
1282
n => {
1295
- let mut node = Node :: Prim ( Fix , sub_span) ;
1296
- for _ in 1 ..n {
1297
- node = Node :: Mod (
1298
- Dip ,
1299
- eco_vec ! [ node. sig_node( ) . unwrap( ) ] ,
1300
- sub_span,
1301
- ) ;
1302
- }
1303
- node
1283
+ Node :: Prim ( Fix , sub_span)
1284
+ . sig_node ( )
1285
+ . unwrap ( )
1286
+ . dipped ( n. saturating_sub ( 1 ) , sub_span)
1287
+ . node
1304
1288
}
1305
1289
} ,
1306
1290
} ;
0 commit comments