@@ -11,6 +11,11 @@ type internal AsyncEnumStatus =
1111 | WithCurrent
1212 | AfterAll
1313
14+ [<Struct>]
15+ type internal WhileKind =
16+ | Inclusive
17+ | Exclusive
18+
1419[<Struct>]
1520type internal Action < 'T , 'U , 'TaskU when 'TaskU :> Task < 'U >> =
1621 | CountableAction of countable_action : ( int -> 'T -> 'U )
@@ -532,28 +537,52 @@ module internal TaskSeqInternal =
532537 | false -> ()
533538 }
534539
535- let takeWhile inclusive predicate ( source : taskSeq < _ >) = taskSeq {
540+ let takeWhile whileKind predicate ( source : taskSeq < _ >) = taskSeq {
536541 use e = source.GetAsyncEnumerator( CancellationToken())
537542 let! step = e.MoveNextAsync()
538543 let mutable more = step
539544
540- match predicate with
541- | Predicate predicate ->
545+ match whileKind , predicate with
546+ | Exclusive , Predicate predicate ->
542547 while more do
543548 let value = e.Current
544549 more <- predicate value
545- if more || inclusive then
550+
551+ if more then
546552 yield value
553+ let! ok = e.MoveNextAsync()
554+ more <- ok
555+
556+ | Inclusive, Predicate predicate ->
557+ while more do
558+ let value = e.Current
559+ more <- predicate value
560+
561+ yield value
562+
547563 if more then
548564 let! ok = e.MoveNextAsync()
549565 more <- ok
550- | PredicateAsync predicate ->
566+
567+ | Exclusive, PredicateAsync predicate ->
551568 while more do
552569 let value = e.Current
553570 let! passed = predicate value
554571 more <- passed
555- if more || inclusive then
572+
573+ if more then
556574 yield value
575+ let! ok = e.MoveNextAsync()
576+ more <- ok
577+
578+ | Inclusive, PredicateAsync predicate ->
579+ while more do
580+ let value = e.Current
581+ let! passed = predicate value
582+ more <- passed
583+
584+ yield value
585+
557586 if more then
558587 let! ok = e.MoveNextAsync()
559588 more <- ok
0 commit comments