Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 25 additions & 25 deletions src/FSharpPlus/Builders.fs
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ module GenericBuilders =
member _.ReturnFrom (expr) = expr : '``monad<'t>``
member inline _.Return (x: 'T) = result x : '``Monad<'T>``
member inline _.Yield (x: 'T) = result x : '``Monad<'T>``
member inline _.Bind (p: '``Monad<'T>``, rest: 'T->'``Monad<'U>``) = p >>= rest : '``Monad<'U>``
member inline _.Bind (p: '``Monad<'T>``, [<InlineIfLambda>]rest: 'T->'``Monad<'U>``) = p >>= rest : '``Monad<'U>``
member inline _.MergeSources (t1: '``Monad<'T>``, t2: '``Monad<'U>``) : '``Monad<'T * 'U>`` = Lift2.Invoke tuple2 t1 t2
member inline _.MergeSources3 (t1: '``Monad<'T>``, t2: '``Monad<'U>``, t3: '``Monad<'V>``) : '``Monad<'T * 'U * 'V>`` = Lift3.Invoke tuple3 t1 t2 t3

Expand All @@ -68,32 +68,32 @@ module GenericBuilders =

type StrictBuilder<'``monad<'t>``> () =
inherit Builder<'``monad<'t>``> ()
member _.Delay expr = expr : unit -> '``Monad<'T>``
member _.Run f = f () : '``monad<'t>``
member inline _.TryWith (expr, handler) = TryWith.InvokeForStrict expr handler : '``Monad<'T>``
member inline _.TryFinally (expr, compensation) = TryFinally.InvokeForStrict expr compensation : '``Monad<'T>``
member inline _.Delay ([<InlineIfLambda>]expr) = expr : unit -> '``Monad<'T>``
member inline _.Run ([<InlineIfLambda>]f) = f () : '``monad<'t>``
member inline _.TryWith ([<InlineIfLambda>]expr, [<InlineIfLambda>]handler) = TryWith.InvokeForStrict expr handler : '``Monad<'T>``
member inline _.TryFinally ([<InlineIfLambda>]expr, [<InlineIfLambda>]compensation) = TryFinally.InvokeForStrict expr compensation : '``Monad<'T>``

member inline _.Using (disposable: #IDisposable, body) = Using.Invoke disposable body
member inline _.Using (disposable: #IDisposable, [<InlineIfLambda>]body) = Using.Invoke disposable body

type DelayedBuilder<'``monad<'t>``> () =
inherit Builder<'``monad<'t>``> ()
member inline _.Delay (expr: _->'``Monad<'T>``) = Delay.Invoke expr : '``Monad<'T>``
member inline _.Delay ([<InlineIfLambda>]expr: _->'``Monad<'T>``) = Delay.Invoke expr : '``Monad<'T>``
member _.Run f = f : '``monad<'t>``
member inline _.TryWith (expr, handler ) = TryWith.Invoke expr handler : '``Monad<'T>``
member inline _.TryFinally (expr, compensation) = TryFinally.Invoke expr compensation : '``Monad<'T>``
member inline _.Using (disposable: #IDisposable, body) = Using.Invoke disposable body : '``Monad<'T>``
member inline _.TryWith (expr, [<InlineIfLambda>]handler ) = TryWith.Invoke expr handler : '``Monad<'T>``
member inline _.TryFinally (expr, [<InlineIfLambda>]compensation) = TryFinally.Invoke expr compensation : '``Monad<'T>``
member inline _.Using (disposable: #IDisposable, [<InlineIfLambda>]body) = Using.Invoke disposable body : '``Monad<'T>``

type MonadPlusStrictBuilder<'``monad<'t>``> () =
inherit StrictBuilder<'``monad<'t>``> ()
member _.YieldFrom expr = expr : '``monad<'t>``
member inline _.Zero () = Empty.Invoke () : '``MonadPlus<'T>``
member inline _.Combine (a: '``MonadPlus<'T>``, b) = a <|> b () : '``MonadPlus<'T>``
member inline _.While (guard, body: unit -> '``MonadPlus<'T>``) : '``MonadPlus<'T>`` =
member inline _.Combine (a: '``MonadPlus<'T>``, [<InlineIfLambda>]b) = a <|> b () : '``MonadPlus<'T>``
member inline _.While ([<InlineIfLambda>]guard, [<InlineIfLambda>]body: unit -> '``MonadPlus<'T>``) : '``MonadPlus<'T>`` =
let rec loop guard body =
if guard () then body () <|> loop guard body
else Empty.Invoke ()
loop guard body
member inline this.For (p: #seq<'T>, rest: 'T->'``MonadPlus<'U>``) =
member inline this.For (p: #seq<'T>, [<InlineIfLambda>]rest: 'T->'``MonadPlus<'U>``) =
Using.Invoke (p.GetEnumerator () :> IDisposable) (fun enum ->
let enum = enum :?> IEnumerator<_>
this.While (enum.MoveNext, fun () -> rest enum.Current) : '``MonadPlus<'U>``)
Expand All @@ -102,14 +102,14 @@ module GenericBuilders =
inherit StrictBuilder<'``monad<'t>``> ()

member inline _.Zero () = result () : '``Monad<unit>``
member inline _.Combine (a: '``Monad<unit>``, b) = a >>= (fun () -> b ()) : '``Monad<'T>``
member inline _.Combine (a: '``Monad<unit>``, [<InlineIfLambda>]b) = a >>= (fun () -> b ()) : '``Monad<'T>``

member inline _.While (guard, body: unit -> '``Monad<unit>``) : '``Monad<unit>`` =
member inline _.While ([<InlineIfLambda>]guard, [<InlineIfLambda>]body: unit -> '``Monad<unit>``) : '``Monad<unit>`` =
let rec loop guard body =
if guard () then body () >>= fun () -> loop guard body
else result ()
loop guard body
member inline this.For (p: #seq<'T>, rest: 'T->'``Monad<unit>``) =
member inline this.For (p: #seq<'T>, [<InlineIfLambda>]rest: 'T->'``Monad<unit>``) =
Using.Invoke (p.GetEnumerator () :> IDisposable) (fun enum ->
let enum = enum :?> IEnumerator<_>
this.While (enum.MoveNext, fun () -> rest enum.Current) : '``Monad<unit>``)
Expand All @@ -121,17 +121,17 @@ module GenericBuilders =
member inline _.Zero () = Empty.Invoke () : '``MonadPlus<'T>``
member inline _.Combine (a: '``MonadPlus<'T>``, b) = a <|> b : '``MonadPlus<'T>``

member inline _.WhileImpl (guard, body: '``MonadPlus<'T>``) : '``MonadPlus<'T>`` =
member inline _.WhileImpl ([<InlineIfLambda>]guard, body: '``MonadPlus<'T>``) : '``MonadPlus<'T>`` =
let rec fix () = Delay.Invoke (fun () -> if guard () then body <|> fix () else Empty.Invoke ())
fix ()

member inline this.While (guard, body: '``MonadPlus<'T>``) : '``MonadPlus<'T>`` =
member inline this.While ([<InlineIfLambda>]guard, body: '``MonadPlus<'T>``) : '``MonadPlus<'T>`` =
// Check the type is lazy, otherwise display a warning.
let __ () = TryWith.InvokeForWhile (Unchecked.defaultof<'``MonadPlus<'T>``>) (fun (_: exn) -> Unchecked.defaultof<'``MonadPlus<'T>``>) : '``MonadPlus<'T>``

this.WhileImpl (guard, body)

member inline this.For (p: #seq<'T>, rest: 'T->'``MonadPlus<'U>``) : '``MonadPlus<'U>`` =
member inline this.For (p: #seq<'T>, [<InlineIfLambda>]rest: 'T->'``MonadPlus<'U>``) : '``MonadPlus<'U>`` =
let mutable isReallyDelayed = true
Delay.Invoke (fun () -> isReallyDelayed <- false; Empty.Invoke () : '``MonadPlus<'U>``) |> ignore
Using.Invoke (p.GetEnumerator () :> IDisposable) (fun enum ->
Expand Down Expand Up @@ -159,18 +159,18 @@ module GenericBuilders =

member inline _.Combine (a: '``Monad<unit>``, b) = a >>= (fun () -> b) : '``Monad<'T>``

member inline _.WhileImpl (guard, body: '``Monad<unit>``) : '``Monad<unit>`` =
member inline _.WhileImpl ([<InlineIfLambda>]guard, body: '``Monad<unit>``) : '``Monad<unit>`` =
let rec loop guard body =
if guard () then body >>= (fun () -> loop guard body)
else result ()
loop guard body

member inline this.While (guard, body: '``Monad<unit>``) : '``Monad<unit>`` =
member inline this.While ([<InlineIfLambda>]guard, body: '``Monad<unit>``) : '``Monad<unit>`` =
// Check the type is lazy, otherwise display a warning.
let __ () = TryWith.InvokeForWhile (Unchecked.defaultof<'``Monad<unit>``>) (fun (_: exn) -> Unchecked.defaultof<'``Monad<unit>``>) : '``Monad<unit>``
this.WhileImpl (guard, body)

member inline this.For (p: #seq<'T>, rest: 'T->'``Monad<unit>``) : '``Monad<unit>``=
member inline this.For (p: #seq<'T>, [<InlineIfLambda>]rest: 'T->'``Monad<unit>``) : '``Monad<unit>``=
let mutable isReallyDelayed = true
Delay.Invoke (fun () -> isReallyDelayed <- false; Return.Invoke () : '``Monad<unit>``) |> ignore
Using.Invoke (p.GetEnumerator () :> IDisposable) (fun enum ->
Expand All @@ -184,7 +184,7 @@ module GenericBuilders =
member _.ReturnFrom (expr) = expr : '``applicative<'t>``
member inline _.Return (x: 'T) = result x : '``Applicative<'T>``
member inline _.Yield (x: 'T) = result x : '``Applicative<'T>``
member inline _.BindReturn(x, f) = map f x : '``Applicative<'U>``
member inline _.BindReturn(x, [<InlineIfLambda>]f) = map f x : '``Applicative<'U>``
member inline _.MergeSources (t1: '``Applicative<'T>``, t2: '``Applicative<'U>``) : '``Applicative<'T * 'U>`` = Lift2.Invoke tuple2 t1 t2
member inline _.MergeSources3 (t1: '``Applicative<'T>``, t2: '``Applicative<'U>``, t3: '``Applicative<'V>``) : '``Applicative<'T * 'U * 'V>`` = Lift3.Invoke tuple3 t1 t2 t3
member _.Run f = f : '``applicative<'t>``
Expand All @@ -194,7 +194,7 @@ module GenericBuilders =
member _.ReturnFrom expr : '``applicative1<applicative2<'t>>`` = expr
member inline _.Return (x: 'T) : '``Applicative1<Applicative2<'T>>`` = (result >> result) x
member inline _.Yield (x: 'T) : '``Applicative1<Applicative2<'T>>`` = (result >> result) x
member inline _.BindReturn (x: '``Applicative1<Applicative2<'T>>``, f: _ -> _) : '``Applicative1<Applicative2<'U>>`` = (map >> map) f x
member inline _.BindReturn (x: '``Applicative1<Applicative2<'T>>``, [<InlineIfLambda>]f: _ -> _) : '``Applicative1<Applicative2<'U>>`` = (map >> map) f x
member inline _.MergeSources (t1, t2) : '``Applicative1<Applicative2<'T>>`` = (lift2 >> lift2) tuple2 t1 t2
member inline _.MergeSources3 (t1, t2, t3) : '``Applicative1<Applicative2<'T>>`` = (lift3 >> lift3) tuple3 t1 t2 t3
member _.Run x : '``applicative1<applicative2<'t>>`` = x
Expand All @@ -204,7 +204,7 @@ module GenericBuilders =
member _.ReturnFrom expr : '``applicative1<applicative2<applicative3<'t>>>`` = expr
member inline _.Return (x: 'T) : '``Applicative1<Applicative2<Applicative3<'T>>>`` = (result >> result >> result) x
member inline _.Yield (x: 'T) : '``Applicative1<Applicative2<Applicative3<'T>>>`` = (result >> result >> result) x
member inline _.BindReturn (x: '``Applicative1<Applicative2<Applicative3<'T>>>``, f: _ -> _) : '``Applicative1<Applicative2<'U>>`` = (map >> map >> map) f x
member inline _.BindReturn (x: '``Applicative1<Applicative2<Applicative3<'T>>>``, [<InlineIfLambda>]f: _ -> _) : '``Applicative1<Applicative2<'U>>`` = (map >> map >> map) f x
member inline _.MergeSources (t1, t2) : '``Applicative1<Applicative2<Applicative3<'T>>>`` = (lift2 >> lift2 >> lift2) tuple2 t1 t2
member inline _.MergeSources3 (t1, t2, t3) : '``Applicative1<Applicative2<Applicative3<'T>>>`` = (lift3 >> lift3 >> lift3) tuple3 t1 t2 t3
member _.Run x : '``applicative1<applicative2<applicative3<'t>>>`` = x
Expand Down