@@ -13,7 +13,9 @@ type internal AsyncEnumStatus =
13
13
14
14
[<Struct>]
15
15
type internal WhileKind =
16
+ /// The item under test is included even if false
16
17
| Inclusive
18
+ /// The item under test is always excluded
17
19
| Exclusive
18
20
19
21
[<Struct>]
@@ -610,6 +612,61 @@ module internal TaskSeqInternal =
610
612
| true -> yield item
611
613
| false -> ()
612
614
}
615
+
616
+ let takeWhile whileKind predicate ( source : taskSeq < _ >) =
617
+ checkNonNull ( nameof source) source
618
+
619
+ taskSeq {
620
+ use e = source.GetAsyncEnumerator( CancellationToken())
621
+ let! step = e.MoveNextAsync()
622
+ let mutable more = step
623
+
624
+ match whileKind, predicate with
625
+ | Exclusive, Predicate predicate ->
626
+ while more do
627
+ let value = e.Current
628
+ more <- predicate value
629
+
630
+ if more then
631
+ yield value
632
+ let! ok = e.MoveNextAsync()
633
+ more <- ok
634
+
635
+ | Inclusive, Predicate predicate ->
636
+ while more do
637
+ let value = e.Current
638
+ more <- predicate value
639
+
640
+ yield value
641
+
642
+ if more then
643
+ let! ok = e.MoveNextAsync()
644
+ more <- ok
645
+
646
+ | Exclusive, PredicateAsync predicate ->
647
+ while more do
648
+ let value = e.Current
649
+ let! passed = predicate value
650
+ more <- passed
651
+
652
+ if more then
653
+ yield value
654
+ let! ok = e.MoveNextAsync()
655
+ more <- ok
656
+
657
+ | Inclusive, PredicateAsync predicate ->
658
+ while more do
659
+ let value = e.Current
660
+ let! passed = predicate value
661
+ more <- passed
662
+
663
+ yield value
664
+
665
+ if more then
666
+ let! ok = e.MoveNextAsync()
667
+ more <- ok
668
+ }
669
+
613
670
// Consider turning using an F# version of this instead?
614
671
// https://github.com/i3arnon/ConcurrentHashSet
615
672
type ConcurrentHashSet < 'T when 'T: equality >( ct ) =
0 commit comments