Skip to content

Commit 8c6cebe

Browse files
committed
Merge pull request #16 from eulerfx/master
fix AsyncSeq.scanAsync #11
2 parents 7d67e39 + 4158232 commit 8c6cebe

2 files changed

Lines changed: 18 additions & 7 deletions

File tree

src/FSharp.Control.AsyncSeq/AsyncSeq.fs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -255,14 +255,16 @@ module AsyncSeq =
255255
| Nil -> return def
256256
| Cons(h, _) -> return h }
257257

258-
let rec scanAsync f (state:'State) (input : AsyncSeq<'T>) = asyncSeq {
259-
let! v = input
260-
match v with
261-
| Nil -> ()
262-
| Cons(h, t) ->
258+
let scanAsync f (state:'TState) (input : AsyncSeq<'T>) =
259+
let rec go f state s = asyncSeq {
260+
let! v = s
261+
match v with
262+
| Nil -> ()
263+
| Cons(h, t) ->
263264
let! v = f state h
264265
yield v
265-
yield! t |> scanAsync f v }
266+
yield! t |> go f v }
267+
asyncSeq { yield state ; yield! go f state input }
266268

267269
let iterAsync f (input : AsyncSeq<'T>) = async {
268270
for itm in input do

tests/FSharp.Control.AsyncSeq.Tests/AsyncSeqTests.fs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,16 @@ let ``AsyncSeq.scanAsync``() =
153153
let f i a = i + a
154154
let z = 0
155155
let actual = ls |> AsyncSeq.ofSeq |> AsyncSeq.scanAsync (fun i a -> f i a |> async.Return) z
156-
let expected = ls |> Seq.scan f z |> Seq.skip 1 |> AsyncSeq.ofSeq
156+
let expected = ls |> List.scan f z |> AsyncSeq.ofSeq
157+
Assert.True(EQ expected actual)
158+
159+
[<Test>]
160+
let ``AsyncSeq.scanAsync on empty should emit initial state``() =
161+
let ls = List.empty
162+
let f i a = i + a
163+
let z = 0
164+
let actual = ls |> AsyncSeq.ofSeq |> AsyncSeq.scanAsync (fun i a -> f i a |> async.Return) z
165+
let expected = ls |> List.scan f z |> AsyncSeq.ofSeq
157166
Assert.True(EQ expected actual)
158167

159168

0 commit comments

Comments
 (0)