@@ -690,18 +690,54 @@ module internal TaskSeqInternal =
690
690
691
691
taskSeq {
692
692
match predicate with
693
- | Predicate predicate ->
693
+ | Predicate syncPredicate ->
694
694
for item in source do
695
- if predicate item then
695
+ if syncPredicate item then
696
696
yield item
697
697
698
- | PredicateAsync predicate ->
698
+ | PredicateAsync asyncPredicate ->
699
699
for item in source do
700
- match ! predicate item with
700
+ match ! asyncPredicate item with
701
701
| true -> yield item
702
702
| false -> ()
703
703
}
704
704
705
+ let forall predicate ( source : TaskSeq < _ >) =
706
+ checkNonNull ( nameof source) source
707
+
708
+ match predicate with
709
+ | Predicate syncPredicate -> task {
710
+ use e = source.GetAsyncEnumerator CancellationToken.None
711
+ let mutable state = true
712
+ let! cont = e.MoveNextAsync()
713
+ let mutable hasMore = cont
714
+
715
+ while state && hasMore do
716
+ state <- syncPredicate e.Current
717
+
718
+ if state then
719
+ let! cont = e.MoveNextAsync()
720
+ hasMore <- cont
721
+
722
+ return state
723
+ }
724
+
725
+ | PredicateAsync asyncPredicate -> task {
726
+ use e = source.GetAsyncEnumerator CancellationToken.None
727
+ let mutable state = true
728
+ let! cont = e.MoveNextAsync()
729
+ let mutable hasMore = cont
730
+
731
+ while state && hasMore do
732
+ let! pred = asyncPredicate e.Current
733
+ state <- pred
734
+
735
+ if state then
736
+ let! cont = e.MoveNextAsync()
737
+ hasMore <- cont
738
+
739
+ return state
740
+ }
705
741
706
742
let skipOrTake skipOrTake count ( source : TaskSeq < _ >) =
707
743
checkNonNull ( nameof source) source
0 commit comments