@@ -42,11 +42,15 @@ module AsyncResult =
4242 let retn x =
4343 Ok x
4444 |> Async.singleton
45+
46+ let ok = retn
4547
4648 let returnError x =
4749 Error x
4850 |> Async.singleton
4951
52+ let error = returnError
53+
5054 let map2 f xR yR =
5155 Async.map2 ( Result.map2 f) xR yR
5256
@@ -56,6 +60,58 @@ module AsyncResult =
5660 let apply fAR xAR =
5761 map2 ( fun f x -> f x) fAR xAR
5862
63+
64+ /// <summary>
65+ /// Returns <paramref name="result"/> if it is <c>Ok</c>, otherwise returns <paramref name="ifError"/>
66+ /// </summary>
67+ /// <param name="ifError">The value to use if <paramref name="result"/> is <c>Error</c></param>
68+ /// <param name="result">The input result.</param>
69+ /// <remarks>
70+ /// </remarks>
71+ /// <example>
72+ /// <code>
73+ /// AsyncResult.error "First" |> AsyncResult.orElse (AsyncResult.error "Second") // evaluates to Error ("Second")
74+ /// AsyncResult.error "First" |> AsyncResult.orElse (AsyncResult.ok "Second") // evaluates to Ok ("Second")
75+ /// AsyncResult.ok "First" |> AsyncResult.orElse (AsyncResult.error "Second") // evaluates to Ok ("First")
76+ /// AsyncResult.ok "First" |> AsyncResult.orElse (AsyncResult.ok "Second") // evaluates to Ok ("First")
77+ /// </code>
78+ /// </example>
79+ /// <returns>
80+ /// The result if the result is Ok, else returns <paramref name="ifError"/>.
81+ /// </returns>
82+ let inline orElse ( ifError : Async < Result < 'ok , 'error2 >>) ( result : Async < Result < 'ok , 'error >>) =
83+ async {
84+ match ! result with
85+ | Ok r -> return Ok r
86+ | Error _ -> return ! ifError
87+ }
88+
89+ /// <summary>
90+ /// Returns <paramref name="result"/> if it is <c>Ok</c>, otherwise executes <paramref name="ifErrorFunc"/> and returns the result.
91+ /// </summary>
92+ /// <param name="ifErrorFunc">A function that provides an alternate result when evaluated.</param>
93+ /// <param name="result">The input result.</param>
94+ /// <remarks>
95+ /// <paramref name="ifErrorFunc"/> is not executed unless <paramref name="result"/> is an <c>Error</c>.
96+ /// </remarks>
97+ /// <example>
98+ /// <code>
99+ /// AsyncResult.error "First" |> AsyncResult.orElseWith (fun _ -> AsyncResult.error "Second") // evaluates to Error ("Second")
100+ /// AsyncResult.error "First" |> AsyncResult.orElseWith (fun _ -> AsyncResult.ok "Second") // evaluates to Ok ("Second")
101+ /// AsyncResult.ok "First" |> AsyncResult.orElseWith (fun _ -> AsyncResult.error "Second") // evaluates to Ok ("First")
102+ /// AsyncResult.ok "First" |> AsyncResult.orElseWith (fun _ -> AsyncResult.ok "Second") // evaluates to Ok ("First")
103+ /// </code>
104+ /// </example>
105+ /// <returns>
106+ /// The result if the result is Ok, else the result of executing <paramref name="ifErrorFunc"/>.
107+ /// </returns>
108+ let inline orElseWith ( ifErrorFunc : 'error -> Async < Result < 'ok , 'error2 >>) ( result : Async < Result < 'ok , 'error >>) =
109+ async {
110+ match ! result with
111+ | Ok r -> return Ok r
112+ | Error e -> return ! ifErrorFunc e
113+ }
114+
59115 /// Replaces the wrapped value with unit
60116 let ignore ar =
61117 ar |> map ignore
0 commit comments