From e2c693855d0f3a2a7433afb8e9ce83e8db810dcb Mon Sep 17 00:00:00 2001 From: Viacheslav Koryagin Date: Sat, 16 May 2020 17:31:10 +0300 Subject: [PATCH 1/2] added generic implementation of for loop --- TaskBuilder.fs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/TaskBuilder.fs b/TaskBuilder.fs index b8e0fec..4ff707c 100644 --- a/TaskBuilder.fs +++ b/TaskBuilder.fs @@ -272,6 +272,10 @@ module TaskBuilder = member __.Combine(step : unit Step, continuation) = combine step continuation member __.While(condition : unit -> bool, body : unit -> unit Step) = whileLoop condition body member __.For(sequence : _ seq, body : _ -> unit Step) = forLoop sequence body + member inline _.For (sequence: ^a, body: 'b -> unit Step) = + let mutable e = ( ^a : (member GetEnumerator: unit -> ^Enumerator) sequence) + let moveNext () = ( ^Enumerator : (member MoveNext: unit -> bool) e ) + whileLoop moveNext (fun _ -> body ( ^Enumerator : (member Current: 'b) e)) member __.TryWith(body : unit -> _ Step, catch : exn -> _ Step) = tryWith body catch member __.TryFinally(body : unit -> _ Step, fin : unit -> unit) = tryFinally body fin member __.Using(disp : #IDisposable, body : #IDisposable -> _ Step) = using disp body From c6d67f5a3eee04bf2395cacd5ffecac60568b0cb Mon Sep 17 00:00:00 2001 From: Viacheslav Koryagin Date: Sat, 16 May 2020 19:20:16 +0300 Subject: [PATCH 2/2] added an extra underscore in order to compile by F# <= 4.5 --- TaskBuilder.fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TaskBuilder.fs b/TaskBuilder.fs index 4ff707c..4425dc5 100644 --- a/TaskBuilder.fs +++ b/TaskBuilder.fs @@ -272,7 +272,7 @@ module TaskBuilder = member __.Combine(step : unit Step, continuation) = combine step continuation member __.While(condition : unit -> bool, body : unit -> unit Step) = whileLoop condition body member __.For(sequence : _ seq, body : _ -> unit Step) = forLoop sequence body - member inline _.For (sequence: ^a, body: 'b -> unit Step) = + member inline __.For (sequence: ^a, body: 'b -> unit Step) = let mutable e = ( ^a : (member GetEnumerator: unit -> ^Enumerator) sequence) let moveNext () = ( ^Enumerator : (member MoveNext: unit -> bool) e ) whileLoop moveNext (fun _ -> body ( ^Enumerator : (member Current: 'b) e))