@@ -13,7 +13,9 @@ type internal AsyncEnumStatus =
1313
1414[<Struct>]
1515type internal WhileKind =
16+ /// The item under test is included even if false
1617 | Inclusive
18+ /// The item under test is always excluded
1719 | Exclusive
1820
1921[<Struct>]
@@ -610,6 +612,61 @@ module internal TaskSeqInternal =
610612 | true -> yield item
611613 | false -> ()
612614 }
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+
613670 // Consider turning using an F# version of this instead?
614671 // https://github.com/i3arnon/ConcurrentHashSet
615672 type ConcurrentHashSet < 'T when 'T: equality >( ct ) =
0 commit comments