@@ -802,134 +802,85 @@ module internal TaskSeqInternal =
802
802
taskSeq {
803
803
use e = source.GetAsyncEnumerator CancellationToken.None
804
804
let! notEmpty = e.MoveNextAsync()
805
- let mutable more = notEmpty
805
+ let mutable cont = notEmpty
806
806
807
- match whileKind, predicate with
808
- | Exclusive, Predicate predicate -> // takeWhile
809
- while more do
810
- let value = e.Current
811
- more <- predicate value
807
+ let inclusive =
808
+ match whileKind with
809
+ | Inclusive -> true
810
+ | Exclusive -> false
812
811
813
- if more then
814
- // yield ONLY if predicate is true
815
- yield value
816
- let! hasMore = e.MoveNextAsync()
817
- more <- hasMore
818
-
819
- | Inclusive, Predicate predicate -> // takeWhileInclusive
820
- while more do
821
- let value = e.Current
822
- more <- predicate value
823
-
824
- // yield regardless of result of predicate
825
- yield value
826
-
827
- if more then
812
+ match predicate with
813
+ | Predicate predicate -> // takeWhile(Inclusive)?
814
+ while cont do
815
+ if predicate e.Current then
816
+ yield e.Current
828
817
let! hasMore = e.MoveNextAsync()
829
- more <- hasMore
818
+ cont <- hasMore
819
+ else
820
+ if inclusive then
821
+ yield e.Current
830
822
831
- | Exclusive, PredicateAsync predicate -> // takeWhileAsync
832
- while more do
833
- let value = e.Current
834
- let! passed = predicate value
835
- more <- passed
823
+ cont <- false
836
824
837
- if more then
838
- // yield ONLY if predicate is true
839
- yield value
825
+ | PredicateAsync predicate -> // takeWhile(Inclusive)?Async
826
+ while cont do
827
+ match ! predicate e.Current with
828
+ | true ->
829
+ yield e.Current
840
830
let! hasMore = e.MoveNextAsync()
841
- more <- hasMore
842
-
843
- | Inclusive, PredicateAsync predicate -> // takeWhileInclusiveAsync
844
- while more do
845
- let value = e.Current
846
- let! passed = predicate value
847
- more <- passed
848
-
849
- // yield regardless of predicate
850
- yield value
831
+ cont <- hasMore
832
+ | false ->
833
+ if inclusive then
834
+ yield e.Current
851
835
852
- if more then
853
- let! hasMore = e.MoveNextAsync()
854
- more <- hasMore
836
+ cont <- false
855
837
}
856
838
857
839
let skipWhile whileKind predicate ( source : TaskSeq < _ >) =
858
840
checkNonNull ( nameof source) source
859
841
860
842
taskSeq {
861
843
use e = source.GetAsyncEnumerator CancellationToken.None
862
- let! moveFirst = e.MoveNextAsync()
863
- let mutable more = moveFirst
864
-
865
- match whileKind, predicate with
866
- | Exclusive, Predicate predicate -> // skipWhile
867
- while more && predicate e.Current do
868
- let! hasMore = e.MoveNextAsync()
869
- more <- hasMore
870
-
871
- if more then
872
- // yield the last one where the predicate was false
873
- // (this ensures we skip 0 or more)
874
- yield e.Current
875
-
876
- while ! e.MoveNextAsync() do // get the rest
877
- yield e.Current
878
-
879
- | Inclusive, Predicate predicate -> // skipWhileInclusive
880
- while more && predicate e.Current do
881
- let! hasMore = e.MoveNextAsync()
882
- more <- hasMore
883
-
884
- if more then
885
- // yield the rest (this ensures we skip 1 or more)
886
- while ! e.MoveNextAsync() do
887
- yield e.Current
888
-
889
- | Exclusive, PredicateAsync predicate -> // skipWhileAsync
890
- let mutable cont = true
891
-
892
- if more then
893
- let! hasMore = predicate e.Current
894
- cont <- hasMore
895
-
896
- while more && cont do
897
- let! moveNext = e.MoveNextAsync()
898
-
899
- if moveNext then
900
- let! hasMore = predicate e.Current
901
- cont <- hasMore
902
844
903
- more <- moveNext
904
-
905
- if more then
906
- // yield the last one where the predicate was false
907
- // (this ensures we skip 0 or more)
908
- yield e.Current
845
+ match ! e.MoveNextAsync() with
846
+ | false -> () // Nothing further to do, no matter what the rules are
847
+ | true ->
909
848
910
- while ! e.MoveNextAsync() do // get the rest
911
- yield e.Current
849
+ let exclusive =
850
+ match whileKind with
851
+ | Exclusive -> true
852
+ | Inclusive -> false
912
853
913
- | Inclusive, PredicateAsync predicate -> // skipWhileInclusiveAsync
914
854
let mutable cont = true
915
855
916
- if more then
917
- let! hasMore = predicate e.Current
918
- cont <- hasMore
856
+ match predicate with
857
+ | Predicate predicate -> // skipWhile(Inclusive)?
858
+ while cont do
859
+ if predicate e.Current then // spam -> skip
860
+ let! hasAnother = e.MoveNextAsync()
861
+ cont <- hasAnother
862
+ else // Starting the ham
863
+ if exclusive then
864
+ yield e.Current // return the item as it does not meet the condition for skipping
919
865
920
- while more && cont do
921
- let! moveNext = e.MoveNextAsync ()
866
+ while ! e.MoveNextAsync () do // propagate the rest
867
+ yield e.Current
922
868
923
- if moveNext then
924
- let! hasMore = predicate e.Current
925
- cont <- hasMore
869
+ cont <- false
870
+ | PredicateAsync predicate -> // skipWhile(Inclusive)?Async
871
+ while cont do
872
+ match ! predicate e.Current with
873
+ | true ->
874
+ let! hasAnother = e.MoveNextAsync()
875
+ cont <- hasAnother
876
+ | false -> // We're starting the ham
877
+ if exclusive then
878
+ yield e.Current // return the item as it does not meet the condition for skipping
926
879
927
- more <- moveNext
880
+ while ! e.MoveNextAsync() do // propagate the rest
881
+ yield e.Current
928
882
929
- if more then
930
- // get the rest, this gives 1 or more semantics
931
- while ! e.MoveNextAsync() do
932
- yield e.Current
883
+ cont <- false
933
884
}
934
885
935
886
// Consider turning using an F# version of this instead?
0 commit comments