@@ -360,16 +360,20 @@ impl<'a, Ans: LookupAnswer> AnswersSolver<'a, Ans> {
360360
361361 pub fn decompose_generator ( & self , ty : & Type ) -> Option < ( Type , Type , Type ) > {
362362 match ty {
363- Type :: Union ( u) => {
364- let mut yield_tys = Vec :: new ( ) ;
365- let mut send_tys = Vec :: new ( ) ;
366- let mut return_tys = Vec :: new ( ) ;
367- for member in & u. members {
368- let ( y, s, r) = self . decompose_generator ( member) ?;
369- yield_tys. push ( y) ;
370- send_tys. push ( s) ;
371- return_tys. push ( r) ;
372- }
363+ Type :: Union ( box Union { members, .. } ) => {
364+ let results: Option < Vec < _ > > = members
365+ . iter ( )
366+ . map ( |member| self . decompose_generator ( member) )
367+ . collect ( ) ;
368+ let ( yield_tys, send_tys, return_tys) = results?. into_iter ( ) . fold (
369+ ( Vec :: new ( ) , Vec :: new ( ) , Vec :: new ( ) ) ,
370+ |mut acc, ( yield_ty, send_ty, return_ty) | {
371+ acc. 0 . push ( yield_ty) ;
372+ acc. 1 . push ( send_ty) ;
373+ acc. 2 . push ( return_ty) ;
374+ acc
375+ } ,
376+ ) ;
373377 Some ( (
374378 self . unions ( yield_tys) ,
375379 self . unions ( send_tys) ,
@@ -402,22 +406,34 @@ impl<'a, Ans: LookupAnswer> AnswersSolver<'a, Ans> {
402406 }
403407
404408 pub fn decompose_async_generator ( & self , ty : & Type ) -> Option < ( Type , Type ) > {
405- let yield_ty = self . fresh_var ( ) ;
406- let send_ty = self . fresh_var ( ) ;
407- let async_generator_ty = self . heap . mk_class_type (
408- self . stdlib
409- . async_generator ( yield_ty. to_type ( self . heap ) , send_ty. to_type ( self . heap ) ) ,
410- ) ;
411- if self . is_subset_eq ( & async_generator_ty, ty) {
412- let yield_ty: Type = self . resolve_var_opt ( ty, yield_ty) ?;
413- let send_ty = self
414- . resolve_var_opt ( ty, send_ty)
415- . unwrap_or_else ( || self . heap . mk_none ( ) ) ;
416- Some ( ( yield_ty, send_ty) )
417- } else if ty. is_any ( ) {
418- Some ( ( self . heap . mk_any_explicit ( ) , self . heap . mk_any_explicit ( ) ) )
419- } else {
420- None
409+ match ty {
410+ Type :: Union ( box Union { members, .. } ) => {
411+ let results: Option < Vec < _ > > = members
412+ . iter ( )
413+ . map ( |member| self . decompose_async_generator ( member) )
414+ . collect ( ) ;
415+ let ( yield_tys, send_tys) = results?. into_iter ( ) . unzip ( ) ;
416+ Some ( ( self . unions ( yield_tys) , self . unions ( send_tys) ) )
417+ }
418+ _ => {
419+ let yield_ty = self . fresh_var ( ) ;
420+ let send_ty = self . fresh_var ( ) ;
421+ let async_generator_ty = self . heap . mk_class_type (
422+ self . stdlib
423+ . async_generator ( yield_ty. to_type ( self . heap ) , send_ty. to_type ( self . heap ) ) ,
424+ ) ;
425+ if self . is_subset_eq ( & async_generator_ty, ty) {
426+ let yield_ty: Type = self . resolve_var_opt ( ty, yield_ty) ?;
427+ let send_ty = self
428+ . resolve_var_opt ( ty, send_ty)
429+ . unwrap_or_else ( || self . heap . mk_none ( ) ) ;
430+ Some ( ( yield_ty, send_ty) )
431+ } else if ty. is_any ( ) {
432+ Some ( ( self . heap . mk_any_explicit ( ) , self . heap . mk_any_explicit ( ) ) )
433+ } else {
434+ None
435+ }
436+ }
421437 }
422438 }
423439
0 commit comments