@@ -837,21 +837,21 @@ namespace Microsoft.FSharp.Collections
837837
838838                abstract  Composer :  SeqComponent < 'U , 'V >  ->  SeqComponent < 'T , 'V > 
839839
840-                 abstract  ComposeMap <'S >         : Map < 'S , 'T >        ->  SeqComponent < 'S , 'U > 
841-                 abstract  ComposeFilter         :Filter < 'T >        ->  SeqComponent < 'T , 'U > 
842-                 abstract  ComposeFilterMap <'S >   : FilterMap < 'S , 'T >  ->  SeqComponent < 'S , 'U > 
843-                 abstract  ComposeMapFilter <'S >   : MapFilter < 'S , 'T >  ->  SeqComponent < 'S , 'U > 
844-                 abstract  ComposeSkip           :Skip < 'T >          ->  SeqComponent < 'T , 'U > 
840+                 abstract  ComposeWithMap <'S >              : Map < 'S , 'T >             ->  SeqComponent < 'S , 'U > 
841+                 abstract  ComposeWithFilter              :Filter < 'T >             ->  SeqComponent < 'T , 'U > 
842+                 abstract  ComposeWithFilterThenMap <'S >   : FilterThenMap < 'S , 'T >  ->  SeqComponent < 'S , 'U > 
843+                 abstract  ComposeWithMapThenFilter <'S >   : MapThenFilter < 'S , 'T >  ->  SeqComponent < 'S , 'U > 
844+                 abstract  ComposeWithSkip                :Skip < 'T >               ->  SeqComponent < 'T , 'U > 
845845
846846                default  __.OnComplete   ()  =  () 
847847
848-                 default  first.Composer            ( second : SeqComponent < 'U , 'V >)  :  SeqComponent < 'T , 'V >  =  upcast  Composed ( first,  second) 
848+                 default  first.Composer                 ( second : SeqComponent < 'U , 'V >)           :  SeqComponent < 'T , 'V >  =  upcast  Composed ( first,  second) 
849849
850-                 default  second.ComposeMap  < 'S >        ( first : Map < 'S , 'T >)        :  SeqComponent < 'S , 'U >  =  upcast  Composed ( first,  second) 
851-                 default  second.ComposeFilter           ( first : Filter < 'T >)        :  SeqComponent < 'T , 'U >  =  upcast  Composed ( first,  second) 
852-                 default  second.ComposeFilterMap  < 'S >  ( first : FilterMap < 'S , 'T >)  :  SeqComponent < 'S , 'U >  =  upcast  Composed ( first,  second) 
853-                 default  second.ComposeMapFilter  < 'S >  ( first : MapFilter < 'S , 'T >)  :  SeqComponent < 'S , 'U >  =  upcast  Composed ( first,  second) 
854-                 default  second.ComposeSkip             ( first : Skip < 'T >)          :  SeqComponent < 'T , 'U >  =  upcast  Composed ( first,  second) 
850+                 default  second.ComposeWithMap  < 'S >             ( first : Map < 'S , 'T >)             :  SeqComponent < 'S , 'U >  =  upcast  Composed ( first,  second) 
851+                 default  second.ComposeWithFilter                ( first : Filter < 'T >)             :  SeqComponent < 'T , 'U >  =  upcast  Composed ( first,  second) 
852+                 default  second.ComposeWithFilterThenMap  < 'S >  ( first : FilterThenMap < 'S , 'T >)  :  SeqComponent < 'S , 'U >  =  upcast  Composed ( first,  second) 
853+                 default  second.ComposeWithMapThenFilter  < 'S >  ( first : MapThenFilter < 'S , 'T >)  :  SeqComponent < 'S , 'U >  =  upcast  Composed ( first,  second) 
854+                 default  second.ComposeWithSkip                  ( first : Skip < 'T >)               :  SeqComponent < 'T , 'U >  =  upcast  Composed ( first,  second) 
855855
856856            and  Composed < 'T , 'U , 'V >  ( first : SeqComponent < 'T , 'U >,  second : SeqComponent < 'U , 'V >)  = 
857857                inherit  SeqComponent< 'T, 'V>() 
@@ -874,16 +874,16 @@ namespace Microsoft.FSharp.Collections
874874                inherit  SeqComponent< 'T, 'U>() 
875875
876876                override  first.Composer   ( second : SeqComponent < 'U , 'V >)  :  SeqComponent < 'T , 'V >  = 
877-                     second.ComposeMap  first
877+                     second.ComposeWithMap  first
878878
879-                 override  second.ComposeMap  < 'S >  ( first : Map < 'S , 'T >)  :  SeqComponent < 'S , 'U >  = 
879+                 override  second.ComposeWithMap  < 'S >  ( first : Map < 'S , 'T >)  :  SeqComponent < 'S , 'U >  = 
880880                    upcast  Map ( first.Map >>  second.Map) 
881881
882-                 override  second.ComposeFilter    ( first : Filter < 'T >)  :  SeqComponent < 'T , 'U >  = 
883-                     upcast  FilterMap  ( first.Filter,  second.Map) 
882+                 override  second.ComposeWithFilter    ( first : Filter < 'T >)  :  SeqComponent < 'T , 'U >  = 
883+                     upcast  FilterThenMap  ( first.Filter,  second.Map) 
884884
885-                 override  second.ComposeFilterMap  < 'S >  ( first : FilterMap < 'S , 'T >)  :  SeqComponent < 'S , 'U >  = 
886-                     upcast  FilterMap  ( first.Filter,  first.Map >>  second.Map) 
885+                 override  second.ComposeWithFilterThenMap  < 'S >  ( first : FilterThenMap < 'S , 'T >)  :  SeqComponent < 'S , 'U >  = 
886+                     upcast  FilterThenMap  ( first.Filter,  first.Map >>  second.Map) 
887887
888888                override  __.ProcessNext   ( input : 'T ,  halted : byref < bool >,  output : byref < 'U >)  :  bool  =  
889889                    output <-  map input
@@ -906,17 +906,17 @@ namespace Microsoft.FSharp.Collections
906906            and  Filter < 'T >  ( filter : 'T -> bool )  = 
907907                inherit  SeqComponent< 'T, 'T>() 
908908
909-                 override  this .Composer  ( next : SeqComponent < 'T , 'V >)  :  SeqComponent < 'T , 'V >  = 
910-                     next.ComposeFilter this 
909+                 override  first .Composer  ( second : SeqComponent < 'T , 'V >)  :  SeqComponent < 'T , 'V >  = 
910+                     second.ComposeWithFilter first 
911911
912-                 override  second.ComposeMap  < 'S >  ( first : Map < 'S , 'T >)  :  SeqComponent < 'S , 'T >  = 
913-                     upcast  MapFilter  ( first.Map,  second.Filter) 
912+                 override  second.ComposeWithMap  < 'S >  ( first : Map < 'S , 'T >)  :  SeqComponent < 'S , 'T >  = 
913+                     upcast  MapThenFilter  ( first.Map,  second.Filter) 
914914
915-                 override  second.ComposeFilter    ( first : Filter < 'T >)  :  SeqComponent < 'T , 'T >  = 
915+                 override  second.ComposeWithFilter    ( first : Filter < 'T >)  :  SeqComponent < 'T , 'T >  = 
916916                    upcast  Filter ( Helpers.ComposeFilter first.Filter second.Filter) 
917917
918-                 override  second.ComposeMapFilter  < 'S >  ( first : MapFilter < 'S , 'T >)  :  SeqComponent < 'S , 'T >  = 
919-                     upcast  MapFilter  ( first.Map,  Helpers.ComposeFilter first.Filter second.Filter) 
918+                 override  second.ComposeWithMapThenFilter  < 'S >  ( first : MapThenFilter < 'S , 'T >)  :  SeqComponent < 'S , 'T >  = 
919+                     upcast  MapThenFilter  ( first.Map,  Helpers.ComposeFilter first.Filter second.Filter) 
920920
921921                override  __.ProcessNext   ( input : 'T ,  halted : byref < bool >,  output : byref < 'T >)  :  bool  =  
922922                    if  filter input then 
@@ -927,20 +927,20 @@ namespace Microsoft.FSharp.Collections
927927
928928                member  __.Filter   : 'T -> bool  =  filter
929929
930-             and  MapFilter < 'T , 'U >  ( map : 'T -> 'U ,  filter : 'U -> bool )  = 
930+             and  MapThenFilter < 'T , 'U >  ( map : 'T -> 'U ,  filter : 'U -> bool )  = 
931931                inherit  SeqComponent< 'T, 'U>() 
932932
933933                override  __.ProcessNext   ( input : 'T ,  halted : byref < bool >,  output : byref < 'U >)  : bool  =  
934934                    output <-  map input
935935                    Helpers.avoidTailCall ( filter output) 
936936
937937                override  first.Composer   ( second : SeqComponent < 'U , 'V >): SeqComponent < 'T , 'V >  = 
938-                     second.ComposeMapFilter  first
938+                     second.ComposeWithMapThenFilter  first
939939
940940                member  __.Map      :  'T -> 'U  =  map
941941                member  __.Filter   :  'U -> bool  =  filter
942942
943-             and  FilterMap < 'T , 'U >  ( filter : 'T -> bool ,  map : 'T -> 'U )  = 
943+             and  FilterThenMap < 'T , 'U >  ( filter : 'T -> bool ,  map : 'T -> 'U )  = 
944944                inherit  SeqComponent< 'T, 'U>() 
945945
946946                override  __.ProcessNext   ( input : 'T ,  halted : byref < bool >,  output : byref < 'U >)  :  bool  =  
@@ -950,7 +950,7 @@ namespace Microsoft.FSharp.Collections
950950                    else 
951951                        false 
952952
953-                 override  this .Composer  ( next : SeqComponent < 'U , 'V >)  :  SeqComponent < 'T , 'V >  =  next.ComposeFilterMap this 
953+                 override  first .Composer  ( second : SeqComponent < 'U , 'V >)  :  SeqComponent < 'T , 'V >  =  second.ComposeWithFilterThenMap first 
954954
955955                member  __.Filter   :  'T -> bool  =  filter
956956                member  __.Map      :  'T -> 'U  =  map
@@ -977,10 +977,10 @@ namespace Microsoft.FSharp.Collections
977977                let mutable  count  =  0 
978978
979979                override  first.Composer   ( second : SeqComponent < 'T , 'V >)  :  SeqComponent < 'T , 'V >  = 
980-                     second.ComposeSkip  first
980+                     second.ComposeWithSkip  first
981981
982-                 override  second.ComposeSkip    ( first : Skip < 'T >)  :  SeqComponent < 'T , 'T >  = 
983-                     if  System. Int32.MaxValue -  second .SkipCount >  first .SkipCount then 
982+                 override  second.ComposeWithSkip    ( first : Skip < 'T >)  :  SeqComponent < 'T , 'T >  = 
983+                     if  Int32.MaxValue -  first .SkipCount -  second .SkipCount  >   0  then 
984984                        upcast  Skip ( first.SkipCount +  second.SkipCount) 
985985                    else 
986986                        upcast  Composed ( first,  second) 
@@ -1006,9 +1006,9 @@ namespace Microsoft.FSharp.Collections
10061006
10071007                let mutable  count  =  0 
10081008
1009-                 override  second.ComposeSkip    ( first : Skip < 'T >)  :  SeqComponent < 'T , 'T >  = 
1010-                     if  System. Int32.MaxValue -  second.TakeCount >  first.SkipCount  then 
1011-                         upcast  SkipTake  ( first.SkipCount,  first.SkipCount+ second.TakeCount) 
1009+                 override  second.ComposeWithSkip    ( first : Skip < 'T >)  :  SeqComponent < 'T , 'T >  = 
1010+                     if  Int32.MaxValue -  first.SkipCount  -   second.TakeCount >  0  then 
1011+                         upcast  SkipThenTake  ( first.SkipCount,  first.SkipCount+ second.TakeCount) 
10121012                    else 
10131013                        upcast  Composed ( first,  second) 
10141014
@@ -1030,7 +1030,7 @@ namespace Microsoft.FSharp.Collections
10301030
10311031                member  __.TakeCount  =  takeCount
10321032
1033-             and  SkipTake < 'T >  ( startIdx : int ,  endIdx : int )  = 
1033+             and  SkipThenTake < 'T >  ( startIdx : int ,  endIdx : int )  = 
10341034                inherit  SeqComponent< 'T, 'T>() 
10351035
10361036                let mutable  count  =  0 
@@ -1057,13 +1057,22 @@ namespace Microsoft.FSharp.Collections
10571057                        let  x  =  endIdx -  count
10581058                        invalidOpFmt " tried to take {0} {1} past the end of the seq" 
10591059                            [| SR.GetString SR.notEnoughElements;  x;  ( if  x= 1  then  " element" else  " elements" )|] 
1060+                 
1061+             and  Choose < 'T ,  'U >  ( choose : 'T -> 'U option )  = 
1062+                 inherit  SeqComponent< 'T, 'U>() 
1063+ 
1064+                 override  __.ProcessNext   ( input : 'T ,  halted : byref < bool >,  output : byref < 'U >)  :  bool  = 
1065+                     match  choose input with 
1066+                     |  Some value ->  output <-  value
1067+                                     true 
1068+                     |  None ->  false 
10601069
10611070            type  SeqProcessNextStates  = 
10621071            |  NotStarted =  1 
10631072            |  Finished   =  2 
10641073            |  InProcess  =  3 
10651074
1066-             type  SeqEnumeratorEnumerator < 'T , 'U >( enumerator :IEnumerator < 'T >,  t2u :SeqComponent < 'T , 'U >)  = 
1075+             type  SeqComposedEnumerator < 'T , 'U >( enumerator :IEnumerator < 'T >,  t2u :SeqComponent < 'T , 'U >)  = 
10671076                let mutable  state  =  SeqProcessNextStates.NotStarted
10681077                let mutable  current  =  Unchecked.defaultof< 'U> 
10691078                let mutable  halted  =  false 
@@ -1082,7 +1091,7 @@ namespace Microsoft.FSharp.Collections
10821091                        false 
10831092
10841093                interface  IDisposable with 
1085-                     member  x .Dispose(): unit  = 
1094+                     member  __ .Dispose(): unit  = 
10861095                        match  source with 
10871096                        |  null  ->  () 
10881097                        |  _  ->  source.Dispose ();  source <-  Unchecked.defaultof<_> 
@@ -1095,13 +1104,13 @@ namespace Microsoft.FSharp.Collections
10951104                    member  __.Reset   ()  :  unit  =  noReset () 
10961105
10971106                interface  IEnumerator< 'U>  with 
1098-                     member  x .Current= 
1107+                     member  __ .Current= 
10991108                        match  state with 
11001109                        |  SeqProcessNextStates.NotStarted ->  notStarted() 
11011110                        |  SeqProcessNextStates.Finished ->  alreadyFinished() 
11021111                        |  _  ->  current
11031112
1104-             type  SeqArrayEnumerator < 'T , 'U >( array :array < 'T >,  t2u :SeqComponent < 'T , 'U >)  = 
1113+             type  ArrayComposedEnumerator < 'T , 'U >( array :array < 'T >,  t2u :SeqComponent < 'T , 'U >)  = 
11051114                let mutable  state  =  SeqProcessNextStates.NotStarted
11061115                let mutable  current  =  Unchecked.defaultof< 'U> 
11071116                let mutable  halted  =  false 
@@ -1121,7 +1130,7 @@ namespace Microsoft.FSharp.Collections
11211130                        false 
11221131
11231132                interface  IDisposable with 
1124-                     member  x .Dispose()  :  unit  =  () 
1133+                     member  __ .Dispose()  :  unit  =  () 
11251134
11261135                interface  IEnumerator with 
11271136                    member  this.Current   :  obj  =  box (( Helpers.UpcastEnumerator this)) .Current
@@ -1131,7 +1140,43 @@ namespace Microsoft.FSharp.Collections
11311140                    member  __.Reset   ()  :  unit  =  noReset () 
11321141
11331142                interface  IEnumerator< 'U>  with 
1134-                     member  x.Current  = 
1143+                     member  __.Current  = 
1144+                         match  state with 
1145+                         |  SeqProcessNextStates.NotStarted ->  notStarted() 
1146+                         |  SeqProcessNextStates.Finished ->  alreadyFinished() 
1147+                         |  _  ->  current
1148+ 
1149+             type  ListComposedEnumerator < 'T , 'U >( alist :list < 'T >,  t2u :SeqComponent < 'T , 'U >)  = 
1150+                 let mutable  state  =  SeqProcessNextStates.NotStarted
1151+                 let mutable  current  =  Unchecked.defaultof< 'U> 
1152+                 let mutable  halted  =  false 
1153+ 
1154+                 let mutable  list  =  alist
1155+ 
1156+                 let rec  moveNext   ()  = 
1157+                     match  halted,  list with 
1158+                     |  false ,  head:: tail ->  
1159+                         list <-  tail
1160+                         if  t2u.ProcessNext ( head,  & halted,  & current)  then 
1161+                             true 
1162+                         else 
1163+                             moveNext () 
1164+                     |  _  ->  state <-  SeqProcessNextStates.Finished
1165+                            t2u.OnComplete () 
1166+                            false 
1167+ 
1168+                 interface  IDisposable with 
1169+                     member  __.Dispose ()  :  unit  =  () 
1170+ 
1171+                 interface  IEnumerator with 
1172+                     member  this.Current   :  obj  =  box ( this:> IEnumerator< 'U>) .Current
1173+                     member  __.MoveNext   ()  = 
1174+                         state <-  SeqProcessNextStates.InProcess
1175+                         moveNext () 
1176+                     member  __.Reset   ()  :  unit  =  noReset () 
1177+ 
1178+                 interface  IEnumerator< 'U>  with 
1179+                     member  __.Current  = 
11351180                        match  state with 
11361181                        |  SeqProcessNextStates.NotStarted ->  notStarted() 
11371182                        |  SeqProcessNextStates.Finished ->  alreadyFinished() 
@@ -1145,7 +1190,7 @@ namespace Microsoft.FSharp.Collections
11451190                inherit  ComposableEnumerable< 'U>() 
11461191
11471192                let  getEnumerator   ()  :  IEnumerator < 'U >  = 
1148-                     Helpers.UpcastEnumerator ( new  SeqEnumeratorEnumerator < 'T, 'U>( enumerable.GetEnumerator(),  current ())) 
1193+                     Helpers.UpcastEnumerator ( new  SeqComposedEnumerator < 'T, 'U>( enumerable.GetEnumerator(),  current ())) 
11491194
11501195                interface  IEnumerable with 
11511196                    member  this.GetEnumerator   ()  :  IEnumerator  =  Helpers.UpcastEnumeratorNonGeneric ( getEnumerator ()) 
@@ -1176,7 +1221,7 @@ namespace Microsoft.FSharp.Collections
11761221                inherit  ComposableEnumerable< 'U>() 
11771222
11781223                let  getEnumerator   ()  :  IEnumerator < 'U >  = 
1179-                     Helpers.UpcastEnumerator ( new  SeqArrayEnumerator < 'T, 'U>( array,  current ())) 
1224+                     Helpers.UpcastEnumerator ( new  ArrayComposedEnumerator < 'T, 'U>( array,  current ())) 
11801225
11811226                interface  IEnumerable with 
11821227                    member  this.GetEnumerator   ()  :  IEnumerator  =  Helpers.UpcastEnumeratorNonGeneric ( getEnumerator ()) 
@@ -1204,6 +1249,20 @@ namespace Microsoft.FSharp.Collections
12041249// 
12051250//                        state 
12061251
1252+             type  SeqListEnumerable < 'T , 'U >( alist :list < 'T >,  current : unit -> SeqComponent < 'T , 'U >)  = 
1253+                 inherit  ComposableEnumerable< 'U>() 
1254+ 
1255+                 let  getEnumerator   ()  :  IEnumerator < 'U >  = 
1256+                     Helpers.UpcastEnumerator ( new  ListComposedEnumerator< 'T, 'U>( alist,  current ())) 
1257+ 
1258+                 interface  IEnumerable with 
1259+                     member  this.GetEnumerator   ()  :  IEnumerator  =  Helpers.UpcastEnumeratorNonGeneric ( getEnumerator ()) 
1260+         
1261+                 interface  IEnumerable< 'U>  with 
1262+                     member  this.GetEnumerator   ()  :  IEnumerator < 'U >  =  getEnumerator () 
1263+ 
1264+                 override  __.Compose   ( next : unit -> SeqComponent < 'U , 'V >)  :  IEnumerable < 'V >  = 
1265+                     Helpers.UpcastEnumerable ( new  SeqListEnumerable< 'T, 'V>( alist,  fun   ()  -> ( current ()) .Composer ( next ()))) 
12071266
12081267
12091268#if  FX_ NO_ ICLONEABLE
@@ -1330,6 +1389,7 @@ namespace Microsoft.FSharp.Collections
13301389            match  source with 
13311390            |  :?  SeqComposer.ComposableEnumerable< 'T>  as  s ->  s.Compose createSeqComponent
13321391            |  :?  array< 'T>  as  a ->  SeqComposer.Helpers.UpcastEnumerable ( new  SeqComposer.SeqArrayEnumerable<_,_>( a,  createSeqComponent)) 
1392+             |  :?  list< 'T>  as  a ->  SeqComposer.Helpers.UpcastEnumerable ( new  SeqComposer.SeqListEnumerable<_,_>( a,  createSeqComponent)) 
13331393            |  _  ->  SeqComposer.Helpers.UpcastEnumerable ( new  SeqComposer.SeqEnumerable<_,_>( source,  createSeqComponent)) 
13341394
13351395        let  private  seqFactoryForImmutable  seqComponent  ( source : seq < 'T >)  = 
@@ -1371,8 +1431,7 @@ namespace Microsoft.FSharp.Collections
13711431
13721432        [<CompiledName( " Choose" ) >] 
13731433        let  choose  f source       = 
1374-             checkNonNull " source" 
1375-             revamp  ( IEnumerator.choose f)  source
1434+             source |>  seqFactoryForImmutable ( SeqComposer.Choose f) 
13761435
13771436        [<CompiledName( " Indexed" ) >] 
13781437        let  indexed  source  = 
0 commit comments