File tree Expand file tree Collapse file tree
src/FSharp.Control.AsyncSeq
tests/FSharp.Control.AsyncSeq.Tests Expand file tree Collapse file tree Original file line number Diff line number Diff 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
Original file line number Diff line number Diff 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
You can’t perform that action at this time.
0 commit comments