@@ -250,3 +250,94 @@ module TaskResultOptionCE =
250250 TaskResultOptionBuilder.RunDynamic( code)
251251
252252 let taskResultOption = TaskResultOptionBuilder()
253+
254+ [<AutoOpen>]
255+ module TaskResultOptionCEExtensionsLowPriority =
256+ // Low priority extensions - generic catch-alls
257+ type TaskResultOptionBuilder with
258+
259+ /// <summary >
260+ /// Method lets us transform data types into our internal representation.
261+ /// </summary >
262+ member inline _.Source ( task : Task < 'ok >) : TaskResultOption < 'ok , 'error > =
263+ TaskResultOption.ofTask task
264+
265+ /// <summary >
266+ /// Method lets us transform data types into our internal representation.
267+ /// </summary >
268+ member inline _.Source ( computation : Async < 'ok >) : TaskResultOption < 'ok , 'error > =
269+ computation
270+ |> Async.StartImmediateAsTask
271+ |> TaskResultOption.ofTask
272+
273+ [<AutoOpen>]
274+ module TaskResultOptionCEExtensions =
275+ // Medium-low priority extensions
276+ type TaskResultOptionBuilder with
277+
278+ /// <summary >
279+ /// Needed to allow ` for..in ` and ` for..do ` functionality
280+ /// </summary >
281+ member inline _.Source ( s : #seq<'value> ) : #seq<'value> = s
282+
283+ /// <summary >
284+ /// Method lets us transform data types into our internal representation.
285+ /// </summary >
286+ member inline _.Source ( result : Result < 'ok , 'error >) : TaskResultOption < 'ok , 'error > =
287+ TaskResultOption.ofResult result
288+
289+ /// <summary >
290+ /// Method lets us transform data types into our internal representation.
291+ /// </summary >
292+ member inline this.Source ( result : Choice < 'ok , 'error >) : TaskResultOption < 'ok , 'error > =
293+ this.Source( Result.ofChoice result)
294+
295+ /// <summary >
296+ /// Method lets us transform data types into our internal representation.
297+ /// </summary >
298+ member inline _.Source ( option : 'ok option ) : TaskResultOption < 'ok , 'error > =
299+ TaskResultOption.ofOption option
300+
301+ [<AutoOpen>]
302+ module TaskResultOptionCEExtensionsMediumPriority =
303+ // Medium priority extensions - more specific than generic Task/Async
304+ type TaskResultOptionBuilder with
305+
306+ /// <summary >
307+ /// Method lets us transform data types into our internal representation.
308+ /// </summary >
309+ member inline _.Source
310+ ( asyncResult : Async < Result < 'ok , 'error >>)
311+ : TaskResultOption < 'ok , 'error > =
312+ asyncResult
313+ |> Async.StartImmediateAsTask
314+ |> TaskResultOption.ofTaskResult
315+
316+ /// <summary >
317+ /// Method lets us transform data types into our internal representation.
318+ /// </summary >
319+ member inline _.Source ( taskOption : Task < 'ok option >) : TaskResultOption < 'ok , 'error > =
320+ TaskResultOption.ofTaskOption taskOption
321+
322+ /// <summary >
323+ /// Method lets us transform data types into our internal representation.
324+ /// </summary >
325+ member inline _.Source
326+ ( taskResult : Task < Result < 'ok , 'error >>)
327+ : TaskResultOption < 'ok , 'error > =
328+ TaskResultOption.ofTaskResult taskResult
329+
330+ [<AutoOpen>]
331+ module TaskResultOptionCEExtensionsHighPriority =
332+ // High priority extensions - identity for the self type
333+ type TaskResultOptionBuilder with
334+
335+ /// <summary >
336+ /// Method lets us transform data types into our internal representation. This is the identity method to recognize the self type.
337+ ///
338+ /// See https://stackoverflow.com/questions/35286541/why-would-you-use-builder-source-in-a-custom-computation-expression-builder
339+ /// </summary >
340+ member inline _.Source
341+ ( result : TaskResultOption < 'ok , 'error >)
342+ : TaskResultOption < 'ok , 'error > =
343+ result
0 commit comments