/// <summary> /// Try/Finally workflow. /// </summary> /// <typeparam name="TResult">Computation return type.</typeparam> /// <param name="body">The computation to execute.</param> /// <param name="finally">Finalizer.</param> public static Cloud <TResult> TryFinally <TResult>(Cloud <TResult> body, CloudAction @finally) { return(MBrace.Cloud.TryFinally(body, @finally.Body)); }
/// <summary> /// Wraps given value in cloud computation that returns it. /// </summary> /// <typeparam name="TResult">Value type.</typeparam> /// <param name="value">Value to be wrapped.</param> /// <returns>A cloud computation that will return the value once executed.</returns> public static Cloud <TResult> Select <TResult>(TResult value) { return(Cloud.FromValue(value)); }
// Linq comprehension syntax friendly methods. /// <summary> /// Creates a cloud computation that chains a group of callbacks together. /// </summary> /// <typeparam name="T">Initial return type.</typeparam> /// <typeparam name="U">Secondary return type.</typeparam> /// <typeparam name="V">Final result type.</typeparam> /// <param name="workflow">Initial workflow to execute.</param> /// <param name="continuation">Callback to primary and secondary result values.</param> /// <param name="projection">Result reducing function.</param> /// <returns>A Cloud workflow </returns> public static Cloud <V> SelectMany <T, U, V>(this Cloud <T> workflow, Func <T, Cloud <U> > continuation, Func <T, U, V> projection) { return(workflow.Then(t => continuation(t).Then(u => Cloud.FromValue(projection(t, u))))); }
/// <summary> /// Creates a cloud computation that binds a workflow to a callback. /// </summary> /// <typeparam name="TSource">Source type.</typeparam> /// <typeparam name="TResult">Result type.</typeparam> /// <param name="workflow">Initial workflow to be executed.</param> /// <param name="continuation">Callback workflow to be executed on completion of the former.</param> /// <returns>A combined workflow.</returns> public static Cloud <TResult> Then <TSource, TResult>(this Cloud <TSource> workflow, Func <TSource, TResult> continuation) { Func <TSource, Cloud <TResult> > f = x => continuation(x).AsCloud(); return(Builder.Bind <TSource, TResult>(workflow, f.AsFSharpFunc())); }
/// <summary> /// Creates a cloud computation that binds a workflow to a callback. /// </summary> /// <typeparam name="TSource">Source type.</typeparam> /// <typeparam name="TResult">Result type.</typeparam> /// <param name="workflow">Initial workflow to be executed.</param> /// <param name="continuation">Callback workflow to be executed on completion of the former.</param> /// <returns>A combined workflow.</returns> public static Cloud <TResult> Then <TSource, TResult>(this Cloud <TSource> workflow, Func <TSource, Cloud <TResult> > continuation) { return(Builder.Bind <TSource, TResult>(workflow, continuation.AsFSharpFunc())); }
/// <summary> /// Performs cloud computation discarding its result. /// </summary> /// <typeparam name="TResult">Return type of the given workflow.</typeparam> /// <param name="workflow">The workflow to ignore.</param> public static CloudAction Ignore <TResult>(this Cloud <TResult> workflow) { return(new CloudAction(MCloud.Ignore(workflow))); }