@@ -375,16 +375,20 @@ impl<'a, Ans: LookupAnswer> AnswersSolver<'a, Ans> {
375375
376376 pub fn decompose_generator ( & self , ty : & Type ) -> Option < ( Type , Type , Type ) > {
377377 match ty {
378- Type :: Union ( u) => {
379- let mut yield_tys = Vec :: new ( ) ;
380- let mut send_tys = Vec :: new ( ) ;
381- let mut return_tys = Vec :: new ( ) ;
382- for member in & u. members {
383- let ( y, s, r) = self . decompose_generator ( member) ?;
384- yield_tys. push ( y) ;
385- send_tys. push ( s) ;
386- return_tys. push ( r) ;
387- }
378+ Type :: Union ( box Union { members, .. } ) => {
379+ let results: Option < Vec < _ > > = members
380+ . iter ( )
381+ . map ( |member| self . decompose_generator ( member) )
382+ . collect ( ) ;
383+ let ( yield_tys, send_tys, return_tys) = results?. into_iter ( ) . fold (
384+ ( Vec :: new ( ) , Vec :: new ( ) , Vec :: new ( ) ) ,
385+ |mut acc, ( yield_ty, send_ty, return_ty) | {
386+ acc. 0 . push ( yield_ty) ;
387+ acc. 1 . push ( send_ty) ;
388+ acc. 2 . push ( return_ty) ;
389+ acc
390+ } ,
391+ ) ;
388392 Some ( (
389393 self . unions ( yield_tys) ,
390394 self . unions ( send_tys) ,
@@ -417,22 +421,34 @@ impl<'a, Ans: LookupAnswer> AnswersSolver<'a, Ans> {
417421 }
418422
419423 pub fn decompose_async_generator ( & self , ty : & Type ) -> Option < ( Type , Type ) > {
420- let yield_ty = self . fresh_var ( ) ;
421- let send_ty = self . fresh_var ( ) ;
422- let async_generator_ty = self . heap . mk_class_type (
423- self . stdlib
424- . async_generator ( yield_ty. to_type ( self . heap ) , send_ty. to_type ( self . heap ) ) ,
425- ) ;
426- if self . is_subset_eq ( & async_generator_ty, ty) {
427- let yield_ty: Type = self . resolve_var_opt ( ty, yield_ty) ?;
428- let send_ty = self
429- . resolve_var_opt ( ty, send_ty)
430- . unwrap_or_else ( || self . heap . mk_none ( ) ) ;
431- Some ( ( yield_ty, send_ty) )
432- } else if ty. is_any ( ) {
433- Some ( ( self . heap . mk_any_explicit ( ) , self . heap . mk_any_explicit ( ) ) )
434- } else {
435- None
424+ match ty {
425+ Type :: Union ( box Union { members, .. } ) => {
426+ let results: Option < Vec < _ > > = members
427+ . iter ( )
428+ . map ( |member| self . decompose_async_generator ( member) )
429+ . collect ( ) ;
430+ let ( yield_tys, send_tys) = results?. into_iter ( ) . unzip ( ) ;
431+ Some ( ( self . unions ( yield_tys) , self . unions ( send_tys) ) )
432+ }
433+ _ => {
434+ let yield_ty = self . fresh_var ( ) ;
435+ let send_ty = self . fresh_var ( ) ;
436+ let async_generator_ty = self . heap . mk_class_type (
437+ self . stdlib
438+ . async_generator ( yield_ty. to_type ( self . heap ) , send_ty. to_type ( self . heap ) ) ,
439+ ) ;
440+ if self . is_subset_eq ( & async_generator_ty, ty) {
441+ let yield_ty: Type = self . resolve_var_opt ( ty, yield_ty) ?;
442+ let send_ty = self
443+ . resolve_var_opt ( ty, send_ty)
444+ . unwrap_or_else ( || self . heap . mk_none ( ) ) ;
445+ Some ( ( yield_ty, send_ty) )
446+ } else if ty. is_any ( ) {
447+ Some ( ( self . heap . mk_any_explicit ( ) , self . heap . mk_any_explicit ( ) ) )
448+ } else {
449+ None
450+ }
451+ }
436452 }
437453 }
438454
0 commit comments