Skip to content

Commit 920b4b4

Browse files
committed
Use a struct DU for differentiating between exclusive/inclusive while, and remove a few branching tests
1 parent fe54054 commit 920b4b4

File tree

2 files changed

+39
-10
lines changed

2 files changed

+39
-10
lines changed

src/FSharp.Control.TaskSeq/TaskSeq.fs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -253,10 +253,10 @@ module TaskSeq =
253253
let chooseAsync chooser source = Internal.choose (TryPickAsync chooser) source
254254
let filter predicate source = Internal.filter (Predicate predicate) source
255255
let filterAsync predicate source = Internal.filter (PredicateAsync predicate) source
256-
let takeWhile predicate source = Internal.takeWhile (*inclusive:*)false (Predicate predicate) source
257-
let takeWhileAsync predicate source = Internal.takeWhile false (PredicateAsync predicate) source
258-
let takeWhileInclusive predicate source = Internal.takeWhile true (Predicate predicate) source
259-
let takeWhileInclusiveAsync predicate source = Internal.takeWhile true (PredicateAsync predicate) source
256+
let takeWhile predicate source = Internal.takeWhile Exclusive (Predicate predicate) source
257+
let takeWhileAsync predicate source = Internal.takeWhile Exclusive (PredicateAsync predicate) source
258+
let takeWhileInclusive predicate source = Internal.takeWhile Inclusive (Predicate predicate) source
259+
let takeWhileInclusiveAsync predicate source = Internal.takeWhile Inclusive (PredicateAsync predicate) source
260260
let tryPick chooser source = Internal.tryPick (TryPick chooser) source
261261
let tryPickAsync chooser source = Internal.tryPick (TryPickAsync chooser) source
262262
let tryFind predicate source = Internal.tryFind (Predicate predicate) source

src/FSharp.Control.TaskSeq/TaskSeqInternal.fs

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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>]
1520
type 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

Comments
 (0)