11import std::io;
22import std::math;
3+ import std::collections::list;
34import raylib5::rl;
45import future;
56
@@ -36,7 +37,7 @@ fn any! Lerp.poll(&self, any env) @dynamic {
3637}
3738
3839fn Future lerp (float * place , float a , float b , float duration ) {
39- return @tclone (Lerp {
40+ return @clone (Lerp {
4041 .place = place ,
4142 .a = a ,
4243 .b = b ,
@@ -60,7 +61,7 @@ fn any! Parallel.poll(&urmom, any env) @dynamic {
6061}
6162
6263fn Future parallel (Future [] futures ) {
63- return @tclone (Parallel {
64+ return @clone (Parallel {
6465 .futures = futures ,
6566 });
6667}
@@ -82,33 +83,88 @@ fn any! Seq.poll(&urmom, any env) @dynamic {
8283}
8384
8485fn Future seq (Future [] futures ) {
85- return @tclone (Seq {
86+ return @clone (Seq {
8687 .futures = futures ,
8788 });
8889}
8990
91+ struct Patcher {
92+ List (<Future * >) lerp ;
93+ List (<Future * >) par ;
94+ List (<Future * >) seq ;
95+ }
96+
97+ fn void Patcher .add (& urmom , Future * f ) {
98+ switch (f .type ) {
99+ case Lerp .typeid :
100+ urmom .lerp .push (f );
101+ case Parallel .typeid :
102+ urmom .par .push (f );
103+ case Seq .typeid :
104+ urmom .seq .push (f );
105+ default :
106+ unreachable (" unexpected type " );
107+ }
108+ }
109+
110+ macro @list_patch (list , $Type ) {
111+ for (usz i = 0 ; i < list .len (); i ++ ) {
112+ * list [i ] = (Future ) any_make (list [i ].ptr , $Type .typeid );
113+ }
114+ }
115+
116+ fn void Patcher .patch (& urmom ) {
117+ io::printfn (" Patching futures " );
118+ @list_patch (urmom .lerp , Lerp );
119+ @list_patch (urmom .par , Parallel );
120+ @list_patch (urmom .seq , Seq );
121+ }
122+
123+ fn void Patcher .clear (& urmom ) {
124+ urmom .lerp .clear ();
125+ urmom .par .clear ();
126+ urmom .seq .clear ();
127+ }
128+
90129struct State {
91130 float t1 , t2 ;
92131 bool finished ;
93132 Future anim ;
133+ Patcher patcher ;
94134}
95135
96136State * state = null ;
97137
98138fn void reset_anim ()
99139{
100- // TODO: clean up allocator::temp() here
101- state .anim = parallel (@tclone (Future [* ] {
102- // TODO: Tuck the whole @tclone(Future[*]{ ... }) under the future constructors
140+ // TODO: clean up allocator::heap() here
141+ // Leaky-leaky
142+ state .anim = parallel (@clone (Future [* ] {
143+ // TODO: Tuck the whole @clone(Future[*]{ ... }) under the future constructors
103144 // See if variadic args can be applied here
104- seq (@tclone (Future [* ] {
145+ seq (@clone (Future [* ] {
105146 lerp (& state .t1 , 0 , 1 , CYCLE_DURATION ),
106147 lerp (& state .t1 , 1 , 0 , CYCLE_DURATION / 4 ),
107148 })),
108- seq (@tclone (Future [* ] {
149+ seq (@clone (Future [* ] {
109150 lerp (& state .t2 , 0 , 1 , CYCLE_DURATION + CYCLE_DURATION / 4 ),
110151 }))
111152 }));
153+
154+ state .patcher .clear ();
155+
156+ // TODO: reflection to do this automatically or something
157+ // Maybe Future.traverse(fn void FutureTraverseFn(void *env, Future *f))?
158+
159+ state .patcher .add (& state .anim );
160+ Parallel * p = anycast (state .anim , Parallel )!! ;
161+ foreach (& s : p .futures ) {
162+ state .patcher .add (s );
163+ Seq * s1 = anycast (* s , Seq )!! ;
164+ foreach (& l : s1 .futures ) {
165+ state .patcher .add (l );
166+ }
167+ }
112168}
113169
114170fn void plug_init () @export (" plug_init " )
@@ -125,6 +181,8 @@ fn void* plug_pre_reload() @export("plug_pre_reload")
125181fn void plug_post_reload (void * old_state ) @export (" plug_post_reload " )
126182{
127183 state = old_state ;
184+
185+ state .patcher .patch ();
128186}
129187
130188fn void orbit_circle (Env env , float t , float radius , float orbit , Color color )
0 commit comments