@@ -136,6 +136,39 @@ fn main_0() -> i32 {
136136 assert ! (
137137 ( ( { SImpl :: apply_12( & s. as_pointer( ) , FnPtr :: <fn ( i32 ) -> i32 >:: new( twice_2) , 3 , ) } ) == 106 )
138138 ) ;
139+ let c: Value < i32 > = Rc :: new ( RefCell :: new ( 3 ) ) ;
140+ assert ! (
141+ ( ( {
142+ let _p: Value <( Value <i32 >, Value <i64 >) > = Rc :: new( RefCell :: new( (
143+ Rc :: new( RefCell :: new( 1 . try_into( ) . expect( "failed conversion" ) ) ) ,
144+ Rc :: new( RefCell :: new( 2_i64 . try_into( ) . expect( "failed conversion" ) ) ) ,
145+ ) ) ) ;
146+ SImpl :: combine_13(
147+ & s. as_pointer( ) ,
148+ _p. as_pointer( ) ,
149+ FnPtr :: <fn ( i32 ) -> i32 >:: new( twice_2) ,
150+ ( c. as_pointer( ) ) ,
151+ 4_u64 ,
152+ )
153+ } ) == 112 )
154+ ) ;
155+ let z: Value < i32 > = Rc :: new ( RefCell :: new ( 1 ) ) ;
156+ assert ! (
157+ ( ( {
158+ let _p: Value <( Value <i32 >, Value <i32 >) > = Rc :: new( RefCell :: new( (
159+ Rc :: new( RefCell :: new( 1 . try_into( ) . expect( "failed conversion" ) ) ) ,
160+ Rc :: new( RefCell :: new( 2 . try_into( ) . expect( "failed conversion" ) ) ) ,
161+ ) ) ) ;
162+ SImpl :: combine_14(
163+ & s. as_pointer( ) ,
164+ _p. as_pointer( ) ,
165+ FnPtr :: <fn ( Ptr <i32 >, i32 ) >:: new( add_1) ,
166+ ( z. as_pointer( ) ) ,
167+ 5_u64 ,
168+ )
169+ } ) == 107 )
170+ ) ;
171+ assert ! ( ( ( * z. borrow( ) ) == 6 ) ) ;
139172 let a: Value < Access_S_ > = Rc :: new ( RefCell :: new ( <Access_S_ >:: default ( ) ) ) ;
140173 let cs: Value < Ptr < S > > = Rc :: new ( RefCell :: new ( ( s. as_pointer ( ) ) ) ) ;
141174 let cr: Ptr < S > = s. as_pointer ( ) ;
@@ -186,6 +219,20 @@ pub trait SImpl {
186219 fn apply_10 ( & self , f : FnPtr < fn ( Ptr < i32 > ) > , x : i32 ) -> i32 ;
187220 fn apply_11 ( & self , f : FnPtr < fn ( Ptr < i32 > , i32 ) > , x : i32 ) -> i32 ;
188221 fn apply_12 ( & self , f : FnPtr < fn ( i32 ) -> i32 > , x : i32 ) -> i32 ;
222+ fn combine_13 (
223+ & self ,
224+ p : Ptr < ( Value < i32 > , Value < i64 > ) > ,
225+ f : FnPtr < fn ( i32 ) -> i32 > ,
226+ q : Ptr < i32 > ,
227+ n : u64 ,
228+ ) -> i32 ;
229+ fn combine_14 (
230+ & self ,
231+ p : Ptr < ( Value < i32 > , Value < i32 > ) > ,
232+ f : FnPtr < fn ( Ptr < i32 > , i32 ) > ,
233+ q : Ptr < i32 > ,
234+ n : u64 ,
235+ ) -> i32 ;
189236 fn width_1_char ( & self , x : i32 ) -> i32 ;
190237 fn width_1_int ( & self , x : i32 ) -> i32 ;
191238 fn scale_2_2 ( & self , x : i32 ) -> i32 ;
@@ -243,6 +290,50 @@ impl SImpl for Ptr<S> {
243290 _lhs + ( { ( * f. borrow ( ) ) . call ( ( * x. borrow ( ) ) ) } )
244291 } ;
245292 }
293+ fn combine_13 (
294+ & self ,
295+ p : Ptr < ( Value < i32 > , Value < i64 > ) > ,
296+ f : FnPtr < fn ( i32 ) -> i32 > ,
297+ q : Ptr < i32 > ,
298+ n : u64 ,
299+ ) -> i32 {
300+ let f: Value < FnPtr < fn ( i32 ) -> i32 > > = Rc :: new ( RefCell :: new ( f) ) ;
301+ let q: Value < Ptr < i32 > > = Rc :: new ( RefCell :: new ( q) ) ;
302+ let n: Value < u64 > = Rc :: new ( RefCell :: new ( n) ) ;
303+ return {
304+ let _lhs = {
305+ let _lhs = {
306+ let _lhs = ( * ( * ( * self ) . upgrade ( ) . deref ( ) ) . base . borrow ( ) ) ;
307+ _lhs + ( ( * ( * p. upgrade ( ) . deref ( ) ) . 1 . borrow ( ) ) as i32 )
308+ } ;
309+ _lhs + ( { ( * f. borrow ( ) ) . call ( ( ( * q. borrow ( ) ) . read ( ) ) ) } )
310+ } ;
311+ _lhs + ( ( * n. borrow ( ) ) as i32 )
312+ } ;
313+ }
314+ fn combine_14 (
315+ & self ,
316+ p : Ptr < ( Value < i32 > , Value < i32 > ) > ,
317+ f : FnPtr < fn ( Ptr < i32 > , i32 ) > ,
318+ q : Ptr < i32 > ,
319+ n : u64 ,
320+ ) -> i32 {
321+ let f: Value < FnPtr < fn ( Ptr < i32 > , i32 ) > > = Rc :: new ( RefCell :: new ( f) ) ;
322+ let q: Value < Ptr < i32 > > = Rc :: new ( RefCell :: new ( q) ) ;
323+ let n: Value < u64 > = Rc :: new ( RefCell :: new ( n) ) ;
324+ ( {
325+ let _arg0: Ptr < i32 > = ( * q. borrow ( ) ) . clone ( ) ;
326+ let _arg1: i32 = ( ( * n. borrow ( ) ) as i32 ) ;
327+ ( * f. borrow ( ) ) . call ( _arg0, _arg1)
328+ } ) ;
329+ return {
330+ let _lhs = {
331+ let _lhs = ( * ( * ( * self ) . upgrade ( ) . deref ( ) ) . base . borrow ( ) ) ;
332+ _lhs + ( * ( * p. upgrade ( ) . deref ( ) ) . 0 . borrow ( ) )
333+ } ;
334+ _lhs + ( ( * q. borrow ( ) ) . read ( ) )
335+ } ;
336+ }
246337 fn width_1_char ( & self , x : i32 ) -> i32 {
247338 let x: Value < i32 > = Rc :: new ( RefCell :: new ( x) ) ;
248339 return ( ( * ( * ( * self ) . upgrade ( ) . deref ( ) ) . base . borrow ( ) )
0 commit comments