@@ -837,21 +837,21 @@ namespace Microsoft.FSharp.Collections
837
837
838
838
abstract Composer : SeqComponent < 'U , 'V > -> SeqComponent < 'T , 'V >
839
839
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 >
845
845
846
846
default __.OnComplete () = ()
847
847
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)
849
849
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)
855
855
856
856
and Composed < 'T , 'U , 'V > ( first : SeqComponent < 'T , 'U >, second : SeqComponent < 'U , 'V >) =
857
857
inherit SeqComponent< 'T, 'V>()
@@ -874,16 +874,16 @@ namespace Microsoft.FSharp.Collections
874
874
inherit SeqComponent< 'T, 'U>()
875
875
876
876
override first.Composer ( second : SeqComponent < 'U , 'V >) : SeqComponent < 'T , 'V > =
877
- second.ComposeMap first
877
+ second.ComposeWithMap first
878
878
879
- override second.ComposeMap < 'S > ( first : Map < 'S , 'T >) : SeqComponent < 'S , 'U > =
879
+ override second.ComposeWithMap < 'S > ( first : Map < 'S , 'T >) : SeqComponent < 'S , 'U > =
880
880
upcast Map ( first.Map >> second.Map)
881
881
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)
884
884
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)
887
887
888
888
override __.ProcessNext ( input : 'T , halted : byref < bool >, output : byref < 'U >) : bool =
889
889
output <- map input
@@ -906,17 +906,17 @@ namespace Microsoft.FSharp.Collections
906
906
and Filter < 'T > ( filter : 'T -> bool ) =
907
907
inherit SeqComponent< 'T, 'T>()
908
908
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
911
911
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)
914
914
915
- override second.ComposeFilter ( first : Filter < 'T >) : SeqComponent < 'T , 'T > =
915
+ override second.ComposeWithFilter ( first : Filter < 'T >) : SeqComponent < 'T , 'T > =
916
916
upcast Filter ( Helpers.ComposeFilter first.Filter second.Filter)
917
917
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)
920
920
921
921
override __.ProcessNext ( input : 'T , halted : byref < bool >, output : byref < 'T >) : bool =
922
922
if filter input then
@@ -927,20 +927,20 @@ namespace Microsoft.FSharp.Collections
927
927
928
928
member __.Filter : 'T -> bool = filter
929
929
930
- and MapFilter < 'T , 'U > ( map : 'T -> 'U , filter : 'U -> bool ) =
930
+ and MapThenFilter < 'T , 'U > ( map : 'T -> 'U , filter : 'U -> bool ) =
931
931
inherit SeqComponent< 'T, 'U>()
932
932
933
933
override __.ProcessNext ( input : 'T , halted : byref < bool >, output : byref < 'U >) : bool =
934
934
output <- map input
935
935
Helpers.avoidTailCall ( filter output)
936
936
937
937
override first.Composer ( second : SeqComponent < 'U , 'V >): SeqComponent < 'T , 'V > =
938
- second.ComposeMapFilter first
938
+ second.ComposeWithMapThenFilter first
939
939
940
940
member __.Map : 'T -> 'U = map
941
941
member __.Filter : 'U -> bool = filter
942
942
943
- and FilterMap < 'T , 'U > ( filter : 'T -> bool , map : 'T -> 'U ) =
943
+ and FilterThenMap < 'T , 'U > ( filter : 'T -> bool , map : 'T -> 'U ) =
944
944
inherit SeqComponent< 'T, 'U>()
945
945
946
946
override __.ProcessNext ( input : 'T , halted : byref < bool >, output : byref < 'U >) : bool =
@@ -950,7 +950,7 @@ namespace Microsoft.FSharp.Collections
950
950
else
951
951
false
952
952
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
954
954
955
955
member __.Filter : 'T -> bool = filter
956
956
member __.Map : 'T -> 'U = map
@@ -977,10 +977,10 @@ namespace Microsoft.FSharp.Collections
977
977
let mutable count = 0
978
978
979
979
override first.Composer ( second : SeqComponent < 'T , 'V >) : SeqComponent < 'T , 'V > =
980
- second.ComposeSkip first
980
+ second.ComposeWithSkip first
981
981
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
984
984
upcast Skip ( first.SkipCount + second.SkipCount)
985
985
else
986
986
upcast Composed ( first, second)
@@ -1006,9 +1006,9 @@ namespace Microsoft.FSharp.Collections
1006
1006
1007
1007
let mutable count = 0
1008
1008
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)
1012
1012
else
1013
1013
upcast Composed ( first, second)
1014
1014
@@ -1030,7 +1030,7 @@ namespace Microsoft.FSharp.Collections
1030
1030
1031
1031
member __.TakeCount = takeCount
1032
1032
1033
- and SkipTake < 'T > ( startIdx : int , endIdx : int ) =
1033
+ and SkipThenTake < 'T > ( startIdx : int , endIdx : int ) =
1034
1034
inherit SeqComponent< 'T, 'T>()
1035
1035
1036
1036
let mutable count = 0
@@ -1057,13 +1057,22 @@ namespace Microsoft.FSharp.Collections
1057
1057
let x = endIdx - count
1058
1058
invalidOpFmt " tried to take {0} {1} past the end of the seq"
1059
1059
[| 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
1060
1069
1061
1070
type SeqProcessNextStates =
1062
1071
| NotStarted = 1
1063
1072
| Finished = 2
1064
1073
| InProcess = 3
1065
1074
1066
- type SeqEnumeratorEnumerator < 'T , 'U >( enumerator :IEnumerator < 'T >, t2u :SeqComponent < 'T , 'U >) =
1075
+ type SeqComposedEnumerator < 'T , 'U >( enumerator :IEnumerator < 'T >, t2u :SeqComponent < 'T , 'U >) =
1067
1076
let mutable state = SeqProcessNextStates.NotStarted
1068
1077
let mutable current = Unchecked.defaultof< 'U>
1069
1078
let mutable halted = false
@@ -1082,7 +1091,7 @@ namespace Microsoft.FSharp.Collections
1082
1091
false
1083
1092
1084
1093
interface IDisposable with
1085
- member x .Dispose(): unit =
1094
+ member __ .Dispose(): unit =
1086
1095
match source with
1087
1096
| null -> ()
1088
1097
| _ -> source.Dispose (); source <- Unchecked.defaultof<_>
@@ -1095,13 +1104,13 @@ namespace Microsoft.FSharp.Collections
1095
1104
member __.Reset () : unit = noReset ()
1096
1105
1097
1106
interface IEnumerator< 'U> with
1098
- member x .Current =
1107
+ member __ .Current =
1099
1108
match state with
1100
1109
| SeqProcessNextStates.NotStarted -> notStarted()
1101
1110
| SeqProcessNextStates.Finished -> alreadyFinished()
1102
1111
| _ -> current
1103
1112
1104
- type SeqArrayEnumerator < 'T , 'U >( array :array < 'T >, t2u :SeqComponent < 'T , 'U >) =
1113
+ type ArrayComposedEnumerator < 'T , 'U >( array :array < 'T >, t2u :SeqComponent < 'T , 'U >) =
1105
1114
let mutable state = SeqProcessNextStates.NotStarted
1106
1115
let mutable current = Unchecked.defaultof< 'U>
1107
1116
let mutable halted = false
@@ -1121,7 +1130,7 @@ namespace Microsoft.FSharp.Collections
1121
1130
false
1122
1131
1123
1132
interface IDisposable with
1124
- member x .Dispose() : unit = ()
1133
+ member __ .Dispose() : unit = ()
1125
1134
1126
1135
interface IEnumerator with
1127
1136
member this.Current : obj = box (( Helpers.UpcastEnumerator this)) .Current
@@ -1131,7 +1140,43 @@ namespace Microsoft.FSharp.Collections
1131
1140
member __.Reset () : unit = noReset ()
1132
1141
1133
1142
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 =
1135
1180
match state with
1136
1181
| SeqProcessNextStates.NotStarted -> notStarted()
1137
1182
| SeqProcessNextStates.Finished -> alreadyFinished()
@@ -1145,7 +1190,7 @@ namespace Microsoft.FSharp.Collections
1145
1190
inherit ComposableEnumerable< 'U>()
1146
1191
1147
1192
let getEnumerator () : IEnumerator < 'U > =
1148
- Helpers.UpcastEnumerator ( new SeqEnumeratorEnumerator < 'T, 'U>( enumerable.GetEnumerator(), current ()))
1193
+ Helpers.UpcastEnumerator ( new SeqComposedEnumerator < 'T, 'U>( enumerable.GetEnumerator(), current ()))
1149
1194
1150
1195
interface IEnumerable with
1151
1196
member this.GetEnumerator () : IEnumerator = Helpers.UpcastEnumeratorNonGeneric ( getEnumerator ())
@@ -1176,7 +1221,7 @@ namespace Microsoft.FSharp.Collections
1176
1221
inherit ComposableEnumerable< 'U>()
1177
1222
1178
1223
let getEnumerator () : IEnumerator < 'U > =
1179
- Helpers.UpcastEnumerator ( new SeqArrayEnumerator < 'T, 'U>( array, current ()))
1224
+ Helpers.UpcastEnumerator ( new ArrayComposedEnumerator < 'T, 'U>( array, current ()))
1180
1225
1181
1226
interface IEnumerable with
1182
1227
member this.GetEnumerator () : IEnumerator = Helpers.UpcastEnumeratorNonGeneric ( getEnumerator ())
@@ -1204,6 +1249,20 @@ namespace Microsoft.FSharp.Collections
1204
1249
//
1205
1250
// state
1206
1251
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 ())))
1207
1266
1208
1267
1209
1268
#if FX_ NO_ ICLONEABLE
@@ -1330,6 +1389,7 @@ namespace Microsoft.FSharp.Collections
1330
1389
match source with
1331
1390
| :? SeqComposer.ComposableEnumerable< 'T> as s -> s.Compose createSeqComponent
1332
1391
| :? 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))
1333
1393
| _ -> SeqComposer.Helpers.UpcastEnumerable ( new SeqComposer.SeqEnumerable<_,_>( source, createSeqComponent))
1334
1394
1335
1395
let private seqFactoryForImmutable seqComponent ( source : seq < 'T >) =
@@ -1371,8 +1431,7 @@ namespace Microsoft.FSharp.Collections
1371
1431
1372
1432
[<CompiledName( " Choose" ) >]
1373
1433
let choose f source =
1374
- checkNonNull " source" source
1375
- revamp ( IEnumerator.choose f) source
1434
+ source |> seqFactoryForImmutable ( SeqComposer.Choose f)
1376
1435
1377
1436
[<CompiledName( " Indexed" ) >]
1378
1437
let indexed source =
0 commit comments