Logo Orsak

Web APIs

Orsak isn't tied to a web framework. An effect needs an environment to run, and a request handler is a natural place to create one: from the request, and from the services of the application. Whatever framework handles the request only has to run the effect, and turn its result into a response.

This page builds the same small API with four frameworks: ASP.NET Core's minimal APIs, Giraffe, Oxpecker, and Orsak.AspNetCore. The shared part comes first, and then a section for each framework, which can be read on its own.

This page is a script: it runs with dotnet fsi docs/web-apis.fsx once Orsak is built, and the output shown is from such a run. Scripts can't reference ASP.NET Core as a package, so it first needs dotnet fsi docs/.tools/aspnetcore-references.fsx, which writes a script referencing the ASP.NET Core installed with .NET. The page uses ASP.NET Core 10, Giraffe 8.3 and Oxpecker 2.1.

The shared part

The API creates orders and looks them up. The orders are kept in a store, described in the usual way, and the effects of the API are written once, for all the frameworks:

open System
open System.Collections.Concurrent
open System.Net.Http
open System.Net.Http.Json
open System.Threading
open System.Threading.Tasks
open Microsoft.AspNetCore.Builder
open Microsoft.AspNetCore.Hosting
open Microsoft.AspNetCore.Http
open Microsoft.AspNetCore.TestHost
open Microsoft.Extensions.DependencyInjection
open Microsoft.Extensions.Logging
open Orsak

type Order = { Id: int; Product: string; Quantity: int }

type NewOrder = { Product: string; Quantity: int }

type OrderError =
    | NotFound of id: int
    | Invalid of reason: string

type IOrderStore =
    abstract member Get: id: int -> Task<Order option>
    abstract member Add: NewOrder -> Task<Order>

type IOrderStoreProvider =
    abstract member Orders: IOrderStore

module OrderStore =
    let get id =
        Effect.Create(fun (p: #IOrderStoreProvider) -> p.Orders.Get id)

    let add order =
        Effect.Create(fun (p: #IOrderStoreProvider) -> p.Orders.Add order)

let getOrder id = eff {
    match! OrderStore.get id with
    | Some order -> return order
    | None -> return! Error(NotFound id)
}

let createOrder (order: NewOrder) = eff {
    if order.Quantity <= 0 then
        return! Error(Invalid "the quantity must be positive")
    else
        return! OrderStore.add order
}

The environment is created for each request. It has the store, which the application registers as a singleton service, and the request's HttpContext, for effects that need the request:

type IRequestProvider =
    abstract member Context: HttpContext

type AppEnv(context: HttpContext, orders: IOrderStore) =
    interface IRequestProvider with
        member _.Context = context

    interface IOrderStoreProvider with
        member _.Orders = orders

let createEnv (ctx: HttpContext) =
    AppEnv(ctx, ctx.RequestServices.GetRequiredService<IOrderStore>())

The store keeps the orders in memory:

type InMemoryOrderStore() =
    let orders = ConcurrentDictionary<int, Order>()
    let mutable lastId = 0

    interface IOrderStore with
        member _.Get id =
            Task.FromResult(
                match orders.TryGetValue id with
                | true, order -> Some order
                | _ -> None
            )

        member _.Add order =
            let id = Interlocked.Increment &lastId
            let created = { Id = id; Product = order.Product; Quantity = order.Quantity }
            orders[id] <- created
            Task.FromResult created

To try each version of the API, tryApi starts it on a test server from Microsoft.AspNetCore.TestHost, which handles requests in memory, without a port. It registers the store, lets the framework add its services and map its routes, and then sends the same requests to each version:

let tryApi (addServices: IServiceCollection -> unit) (mapRoutes: WebApplication -> unit) =
    let builder = WebApplication.CreateBuilder()
    builder.WebHost.UseTestServer() |> ignore
    builder.Logging.ClearProviders() |> ignore
    builder.Services.AddSingleton<IOrderStore, InMemoryOrderStore>() |> ignore
    addServices builder.Services
    use app = builder.Build()
    mapRoutes app
    app.StartAsync().Wait()
    use client = app.GetTestClient()

    let show (request: string) (response: HttpResponseMessage) =
        let body = response.Content.ReadAsStringAsync().Result
        printfn $"%-50s{request} -> %d{int response.StatusCode} {body}"

    client.GetAsync("/orders/1").Result |> show "GET /orders/1"

    client.PostAsJsonAsync("/orders", { Product = "mug"; Quantity = 2 }).Result
    |> show "POST /orders {\"product\":\"mug\",\"quantity\":2}"

    client.GetAsync("/orders/1").Result |> show "GET /orders/1"

    client.PostAsJsonAsync("/orders", { Product = "mug"; Quantity = 0 }).Result
    |> show "POST /orders {\"product\":\"mug\",\"quantity\":0}"

    app.StopAsync().Wait()

Each version responds the same way: NotFound becomes a 404, and Invalid a 400 with the reason.

Minimal APIs

A minimal API handler takes the route values and the body as parameters, and returns an IResult. Any other parameter is a service, which ASP.NET Core resolves from its dependency injection container. The usual way to write the API is a service class, with the store injected through its constructor, and the service injected into the handlers:

module WithServices =
    type OrderService(store: IOrderStore) =
        member _.Get(id: int) = store.Get id

        member _.Create(order: NewOrder) : Task<Result<Order, OrderError>> = task {
            if order.Quantity <= 0 then
                return Error(Invalid "the quantity must be positive")
            else
                let! created = store.Add order
                return Ok created
        }

    let mapOrders (app: WebApplication) =
        app.MapGet(
            "/orders/{id:int}",
            Func<int, OrderService, Task<IResult>>(fun id orders -> task {
                match! orders.Get id with
                | Some order -> return Results.Ok order
                | None -> return Results.NotFound()
            })
        )
        |> ignore

        app.MapPost(
            "/orders",
            Func<NewOrder, OrderService, Task<IResult>>(fun order orders -> task {
                match! orders.Create order with
                | Ok created -> return Results.Created($"/orders/{created.Id}", created)
                | Error(Invalid reason) -> return Results.BadRequest reason
                | Error(NotFound _) -> return Results.NotFound()
            })
        )
        |> ignore

    let addServices (services: IServiceCollection) =
        services.AddScoped<OrderService>() |> ignore

F# lambdas aren't converted to Delegate on their own, so each handler is given as a Func, whose parameter types tell ASP.NET Core where to bind each value from:

tryApi WithServices.addServices WithServices.mapOrders
GET /orders/1                                      -> 404
POST /orders {"product":"mug","quantity":2}        -> 201 {"id":1,"product":"mug","quantity":2}
GET /orders/1                                      -> 200 {"id":1,"product":"mug","quantity":2}
POST /orders {"product":"mug","quantity":0}        -> 400 "the quantity must be positive"

Effects work much like this. A handler asks for what it needs, and gets it from outside, so it can be given something else in a test. The difference is in how the asking is done. With effects, the handler creates the environment, runs the effect, and turns its result into an IResult, with a function mapping the errors:

module WithEffects =
    let toResult ok (result: Result<'a, OrderError>) =
        match result with
        | Ok value -> ok value
        | Error(NotFound _) -> Results.NotFound()
        | Error(Invalid reason) -> Results.BadRequest reason

    let mapOrders (app: WebApplication) =
        app.MapGet(
            "/orders/{id:int}",
            Func<int, HttpContext, Task<IResult>>(fun id ctx -> task {
                let! result = getOrder id |> Effect.run (createEnv ctx)
                return result |> toResult Results.Ok
            })
        )
        |> ignore

        app.MapPost(
            "/orders",
            Func<NewOrder, HttpContext, Task<IResult>>(fun order ctx -> task {
                let! result = createOrder order |> Effect.run (createEnv ctx)
                return result |> toResult (fun created -> Results.Created($"/orders/{created.Id}", created))
            })
        )
        |> ignore

The responses are the same, and it needs no services of its own:

tryApi ignore WithEffects.mapOrders
GET /orders/1                                      -> 404
POST /orders {"product":"mug","quantity":2}        -> 201 {"id":1,"product":"mug","quantity":2}
GET /orders/1                                      -> 200 {"id":1,"product":"mug","quantity":2}
POST /orders {"product":"mug","quantity":0}        -> 400 "the quantity must be positive"

What differs is what the types say, and when a mistake is found.

The whole chain of dependencies is in the types. The handler taking an OrderService says that it needs one, but not what OrderService needs in turn: that is in its constructor, and what those services need is in theirs. The full chain only comes together when the container resolves it. The type of an effect, on the other hand, includes what every effect it binds needs. getOrder is an int -> Effect<#IOrderStoreProvider, Order, OrderError>, and if it also read the time with Time.utcNow, its type would become int -> Effect<#IOrderStoreProvider & #ITimeProvider, Order, OrderError>, as would the type of every effect binding it, up to the handler. Nothing is injected out of sight.

A missing dependency is a compile error. If IOrderStore isn't registered, the version with services still compiles and starts. In the Development environment, ASP.NET Core checks the registrations when the application is built, and fails with:

Error while validating the service descriptor 'ServiceType: OrderService Lifetime: Scoped ImplementationType:
OrderService': Unable to resolve service for type 'IOrderStore' while attempting to activate 'OrderService'.

In other environments, the first request needing an OrderService fails, with the second half of that message. If AppEnv doesn't implement IOrderStoreProvider, the version with effects doesn't compile:

error FS0001: The type 'AppEnv' is not compatible with the type 'IOrderStoreProvider'

The two work together, too. createEnv gets the store from the container, which still decides lifetimes and configuration, while the effects make it explicit which of those services each part of the application uses.

Giraffe

A Giraffe HttpHandler can run an effect like any other asynchronous work. A function turning an effect into a handler, given a handler for its value, keeps the routes short:

module GiraffeApi =
    open Giraffe

    let handleEffect (ok: 'a -> HttpHandler) (effect: Effect<AppEnv, 'a, OrderError>) : HttpHandler =
        fun next ctx -> task {
            match! effect |> Effect.run (createEnv ctx) with
            | Ok value -> return! ok value next ctx
            | Error(NotFound _) -> return! RequestErrors.NOT_FOUND "" next ctx
            | Error(Invalid reason) -> return! RequestErrors.BAD_REQUEST reason next ctx
        }

    let webApp: HttpHandler =
        choose [
            GET >=> routef "/orders/%i" (getOrder >> handleEffect json)
            POST >=> route "/orders" >=> bindJson<NewOrder> (createOrder >> handleEffect Successful.CREATED)
        ]

    let addServices (services: IServiceCollection) = services.AddGiraffe() |> ignore
    let mapRoutes (app: WebApplication) = app.UseGiraffe webApp

routef and bindJson pass the route value and the body to a function, so composing it with handleEffect is enough:

tryApi GiraffeApi.addServices GiraffeApi.mapRoutes
GET /orders/1                                      -> 404 ""
POST /orders {"product":"mug","quantity":2}        -> 201 {"id":1,"product":"mug","quantity":2}
GET /orders/1                                      -> 200 {"id":1,"product":"mug","quantity":2}
POST /orders {"product":"mug","quantity":0}        -> 400 "the quantity must be positive"

Oxpecker

Oxpecker's EndpointHandler takes the HttpContext and returns a Task, and the same approach works:

module OxpeckerApi =
    open Oxpecker

    let handleEffect (ok: 'a -> EndpointHandler) (effect: Effect<AppEnv, 'a, OrderError>) : EndpointHandler =
        fun ctx -> task {
            match! effect |> Effect.run (createEnv ctx) with
            | Ok value -> return! ok value ctx
            | Error(NotFound _) -> ctx.SetStatusCode 404
            | Error(Invalid reason) ->
                ctx.SetStatusCode 400
                return! ctx.WriteText reason
        }

    let created (order: Order) : EndpointHandler =
        fun ctx ->
            ctx.SetStatusCode 201
            ctx.WriteJson order

    let endpoints = [
        GET [ routef "/orders/{%i}" (getOrder >> handleEffect json) ]
        POST [ route "/orders" (bindJson<NewOrder> (createOrder >> handleEffect created)) ]
    ]

    let addServices (services: IServiceCollection) =
        services.AddRouting().AddOxpecker() |> ignore

    let mapRoutes (app: WebApplication) =
        app.UseRouting().UseOxpecker(endpoints) |> ignore

Oxpecker writes the reason for the 400 as plain text, where the others write it as JSON:

tryApi OxpeckerApi.addServices OxpeckerApi.mapRoutes
GET /orders/1                                      -> 404
POST /orders {"product":"mug","quantity":2}        -> 201 {"id":1,"product":"mug","quantity":2}
GET /orders/1                                      -> 200 {"id":1,"product":"mug","quantity":2}
POST /orders {"product":"mug","quantity":0}        -> 400 the quantity must be positive

Orsak.AspNetCore

Orsak.AspNetCore maps endpoints whose handlers return effects. How an effect becomes a response is up to the application, which writes it once, as a *>> operator on a runner type. The runner here creates the environment, runs the effect, and executes the IResult it returns, or the response for its error:

module OrsakApi =
    open Orsak.AspNetCore

    type Runner =
        | RunWith of (HttpContext -> AppEnv)

        static member ( *>> )(effect: Effect<AppEnv, IResult, OrderError>, RunWith createEnv) =
            RequestDelegate(fun ctx -> task {
                let! result = effect |> Effect.run (createEnv ctx)

                let response =
                    match result with
                    | Ok response -> response
                    | Error(NotFound _) -> Results.NotFound()
                    | Error(Invalid reason) -> Results.BadRequest reason

                return! response.ExecuteAsync ctx
            })

The handlers are effects too. Route values are written as format specifiers, such as %i for an int, and named after the handler's parameters, so /orders/%i with getOrderEndpoint maps /orders/{id:int}. The body is read by an effect, from the request in the environment:

    module Request =
        let readJson () : Effect<#IRequestProvider, 'T, _> =
            Effect.Create(fun (p: #IRequestProvider) -> p.Context.Request.ReadFromJsonAsync<'T>())

    let getOrderEndpoint (id: int) = eff {
        let! order = getOrder id
        return Results.Ok order
    }

    let postOrderEndpoint () = eff {
        let! (order: NewOrder) = Request.readJson ()
        let! created = createOrder order
        return Results.Created($"/orders/{created.Id}", created)
    }

    let mapRoutes (app: WebApplication) =
        app.UseRouting().UseEndpoints(fun endpoints ->
            let runner = RunWith createEnv

            endpoints.MapEffectEndpoints [
                runner.RouteGet("/orders/%i", getOrderEndpoint)
                runner.RoutePost("/orders", postOrderEndpoint)
            ])
        |> ignore

The handlers are passed as functions, not called, as their parameter names are read from them. Each endpoint is also instrumented with Orsak's diagnostics, and takes conventions such as .RequiresAuthorization() and .WithName(...). Orsak.AspNetCore needs no services of its own:

tryApi ignore OrsakApi.mapRoutes
GET /orders/1                                      -> 404
POST /orders {"product":"mug","quantity":2}        -> 201 {"id":1,"product":"mug","quantity":2}
GET /orders/1                                      -> 200 {"id":1,"product":"mug","quantity":2}
POST /orders {"product":"mug","quantity":0}        -> 400 "the quantity must be positive"
namespace System
namespace System.Collections
namespace System.Collections.Concurrent
namespace System.Net
namespace System.Net.Http
namespace System.Net.Http.Json
namespace System.Threading
namespace System.Threading.Tasks
namespace Microsoft
namespace Microsoft.AspNetCore
namespace Microsoft.AspNetCore.Builder
namespace Microsoft.AspNetCore.Hosting
namespace Microsoft.AspNetCore.Http
namespace Microsoft.AspNetCore.TestHost
namespace Microsoft.Extensions
namespace Microsoft.Extensions.DependencyInjection
namespace Microsoft.Extensions.Logging
namespace Orsak
type Order = { Id: int Product: string Quantity: int }
Multiple items
val int: value: 'T -> int (requires member op_Explicit)

--------------------
type int = int32

--------------------
type int<'Measure> = int
Multiple items
val string: value: 'T -> string

--------------------
type string = String
type NewOrder = { Product: string Quantity: int }
type OrderError = | NotFound of id: int | Invalid of reason: string
val id: x: 'T -> 'T
type IOrderStore = abstract Add: NewOrder -> Task<Order> abstract Get: id: int -> Task<Order option>
Multiple items
type Task = interface IAsyncResult interface IDisposable new: action: Action -> unit + 7 overloads member ConfigureAwait: continueOnCapturedContext: bool -> ConfiguredTaskAwaitable + 1 overload member ContinueWith: continuationAction: Action<Task,obj> * state: obj -> Task + 19 overloads member Dispose: unit -> unit member GetAwaiter: unit -> TaskAwaiter member RunSynchronously: unit -> unit + 1 overload member Start: unit -> unit + 1 overload member Wait: unit -> unit + 5 overloads ...
<summary>Represents an asynchronous operation.</summary>

--------------------
type Task<'TResult> = inherit Task new: ``function`` : Func<obj,'TResult> * state: obj -> unit + 7 overloads member ConfigureAwait: continueOnCapturedContext: bool -> ConfiguredTaskAwaitable<'TResult> + 1 overload member ContinueWith: continuationAction: Action<Task<'TResult>,obj> * state: obj -> Task + 19 overloads member GetAwaiter: unit -> TaskAwaiter<'TResult> member WaitAsync: cancellationToken: CancellationToken -> Task<'TResult> + 4 overloads member Result: 'TResult static member Factory: TaskFactory<'TResult>
<summary>Represents an asynchronous operation that can return a value.</summary>
<typeparam name="TResult">The type of the result produced by this <see cref="T:System.Threading.Tasks.Task`1" />.</typeparam>


--------------------
Task(action: Action) : Task
Task(action: Action, cancellationToken: CancellationToken) : Task
Task(action: Action, creationOptions: TaskCreationOptions) : Task
Task(action: Action<obj>, state: obj) : Task
Task(action: Action, cancellationToken: CancellationToken, creationOptions: TaskCreationOptions) : Task
Task(action: Action<obj>, state: obj, cancellationToken: CancellationToken) : Task
Task(action: Action<obj>, state: obj, creationOptions: TaskCreationOptions) : Task
Task(action: Action<obj>, state: obj, cancellationToken: CancellationToken, creationOptions: TaskCreationOptions) : Task

--------------------
Task(``function`` : Func<'TResult>) : Task<'TResult>
Task(``function`` : Func<obj,'TResult>, state: obj) : Task<'TResult>
Task(``function`` : Func<'TResult>, cancellationToken: CancellationToken) : Task<'TResult>
Task(``function`` : Func<'TResult>, creationOptions: TaskCreationOptions) : Task<'TResult>
Task(``function`` : Func<obj,'TResult>, state: obj, cancellationToken: CancellationToken) : Task<'TResult>
Task(``function`` : Func<obj,'TResult>, state: obj, creationOptions: TaskCreationOptions) : Task<'TResult>
Task(``function`` : Func<'TResult>, cancellationToken: CancellationToken, creationOptions: TaskCreationOptions) : Task<'TResult>
Task(``function`` : Func<obj,'TResult>, state: obj, cancellationToken: CancellationToken, creationOptions: TaskCreationOptions) : Task<'TResult>
type 'T option = Option<'T>
type IOrderStoreProvider = abstract Orders: IOrderStore
val get: id: int -> Effect<#IOrderStoreProvider,Order option,'b>
val id: int
Multiple items
union case Effect.Effect: EffectDelegate<'r,'a,'e> -> Effect<'r,'a,'e>

--------------------
module Effect from Orsak
<summary> Functions for running, combining, recovering and repeating effects. </summary>

--------------------
type Effect = static member Create: f: ('a -> Task<Result<'b,'e>>) -> Effect<'a,'b,'e> + 2 overloads static member Error: error: 'e -> Effect<'a,'b,'e>
<summary> Creates effects. <c>Effect.Create</c> turns a function of an environment into an effect, and is how effects are made from the interfaces that describe side effects. The function may return a plain value, a <c>Result</c>, a <c>Task</c>, a <c>ValueTask</c> or an <c>Async</c>, of a value or of a <c>Result</c>; returning a <c>Result</c> lets the effect fail. </summary>
<example> The usual pattern: an interface describing the side effect, a provider interface exposing it, and a function creating the effect, which requires any environment that implements the provider (<c>#IConsoleProvider</c>). <code lang="fsharp"> type IConsole = abstract ReadLine: unit -&gt; string abstract WriteLine: string -&gt; unit type IConsoleProvider = abstract Console: IConsole module Console = let readLine () = Effect.Create(fun (p: #IConsoleProvider) -&gt; p.Console.ReadLine()) let writeLine line = Effect.Create(fun (p: #IConsoleProvider) -&gt; p.Console.WriteLine line) </code> The Orsak.Myriad generators can write the functions of such a module from the interface. </example>


--------------------
type Effect<'r,'a,'e> = | Effect of EffectDelegate<'r,'a,'e> member Run: r: 'r -> AsyncResult<'a,'e> member RunOrFail: r: 'r -> Task<'a> static member (<*>)<'b,'a (requires member (+))> : f: Effect<'r,('b -> 'a),'a0> * e: Effect<'r,'b,'a0> -> Effect<'r,'a,'a0> (requires member (+)) static member (>>=) : h: Effect<'r,'a,'e> * f: ('a -> Effect<'r,'b,'e>) -> Effect<'r,'b,'e> static member Map: h: Effect<'r,'a,'e> * f: ('a -> 'b) -> Effect<'r,'b,'e> static member Return<'a,'b,'c> : a: 'a0 -> Effect<'b,'a0,'c> static member ap<'r,'a,'b,'e> : applicative: Effect<'r,('b -> 'a),'e> -> e: Effect<'r,'b,'e> -> Effect<'r,'a,'e>
<summary> Describes an effect that can either succeed with <typeparamref name="'a" />, or fail with <typeparamref name="'e" />. The effect is 'cold', and only starts when run with an <typeparamref name="'r" />. </summary>
<remarks> Effects are usually written with the <c>eff</c> computation expression, and created from interfaces that describe side effects with <c>Effect.Create</c>. The environment <typeparamref name="'r" /> is inferred from what the effect uses, and supplied when the effect is run. </remarks>
<example><code lang="fsharp"> let greet () = eff { let! name = Console.readLine () do! Console.writeLine $"Hello {name}" } // at the composition root, with an environment providing the console effects: let! result = greet () |&gt; Effect.run env </code></example>
<typeparam name="'r"> The environment required to run the effect </typeparam>
<typeparam name="'a"> The resulting type when the effect runs successfully </typeparam>
<typeparam name="'e"> The resulting type when the effect fails</typeparam>
static member Effect.Create: f: ('a -> 'b) -> Effect<'a,'b,'e>
static member Effect.Create: f: ('a -> Async<'b>) -> Effect<'a,'b,'a0>
static member Effect.Create: f: ('a -> Result<'b,'e>) -> Effect<'a,'b,'e>
static member Effect.Create: f: ('a -> Task<'b>) -> Effect<'a,'b,'a0>
static member Effect.Create: f: ('a -> ValueTask<'b>) -> Effect<'a,'b,'a0>
static member Effect.Create: f: ('a -> Async<Result<'b,'e>>) -> Effect<'a,'b,'e>
static member Effect.Create: f: ('a -> ValueTask<Result<'b,'e>>) -> Effect<'a,'b,'e>
static member Effect.Create: f: ('a -> Task<Result<'b,'e>>) -> Effect<'a,'b,'e>
val p: #IOrderStoreProvider
property IOrderStoreProvider.Orders: IOrderStore with get
abstract IOrderStore.Get: id: int -> Task<Order option>
val add: order: NewOrder -> Effect<#IOrderStoreProvider,Order,'b>
val order: NewOrder
abstract IOrderStore.Add: NewOrder -> Task<Order>
val getOrder: id: int -> Effect<#IOrderStoreProvider,Order,OrderError>
val eff: EffBuilder
<summary> The computation expression for writing effects. Binding (<c>let!</c>, <c>do!</c>, <c>return!</c>) works with other effects, and with <c>Task</c>, <c>ValueTask</c>, <c>Async</c> and <c>Result</c>, so .NET APIs can be used directly. It supports <c>for</c>, <c>while</c>, <c>use</c>, <c>try/with</c> and <c>try/finally</c>, and <c>and!</c> runs effects concurrently. A failed effect stops the rest of the expression, with its error. </summary>
<example><code lang="fsharp"> let placeOrder (order: Order) = eff { let! id = GuidGenerator.genGuid () let! now = Time.utcNow () do! Orders.save { order with Id = id; Placed = now } let! customer = Customers.load order.CustomerId and! stock = Stock.reserve order.Lines return id } </code></example>
module OrderStore from Web-apis
union case Option.Some: Value: 'T -> Option<'T>
val order: Order
union case Option.None: Option<'T>
union case Result.Error: ErrorValue: 'TError -> Result<'T,'TError>
union case OrderError.NotFound: id: int -> OrderError
val createOrder: order: NewOrder -> Effect<#IOrderStoreProvider,Order,OrderError>
NewOrder.Quantity: int
union case OrderError.Invalid: reason: string -> OrderError
type IRequestProvider = abstract Context: HttpContext
type HttpContext = override Abort: unit -> unit member Connection: ConnectionInfo member Features: IFeatureCollection member Items: IDictionary<obj,obj> member Request: HttpRequest member RequestAborted: CancellationToken member RequestServices: IServiceProvider member Response: HttpResponse member Session: ISession member TraceIdentifier: string ...
Multiple items
type AppEnv = interface IOrderStoreProvider interface IRequestProvider new: context: HttpContext * orders: IOrderStore -> AppEnv

--------------------
new: context: HttpContext * orders: IOrderStore -> AppEnv
val context: HttpContext
val orders: IOrderStore
val createEnv: ctx: HttpContext -> AppEnv
val ctx: HttpContext
property HttpContext.RequestServices: IServiceProvider with get, set
(extension) IServiceProvider.GetRequiredService<'T>() : 'T
(extension) IServiceProvider.GetRequiredService(serviceType: Type) : obj
Multiple items
type InMemoryOrderStore = interface IOrderStore new: unit -> InMemoryOrderStore

--------------------
new: unit -> InMemoryOrderStore
val orders: ConcurrentDictionary<int,Order>
Multiple items
type ConcurrentDictionary<'TKey,'TValue> = interface ICollection<KeyValuePair<'TKey,'TValue>> interface seq<KeyValuePair<'TKey,'TValue>> interface IEnumerable interface IDictionary<'TKey,'TValue> interface IReadOnlyCollection<KeyValuePair<'TKey,'TValue>> interface IReadOnlyDictionary<'TKey,'TValue> interface ICollection interface IDictionary new: unit -> unit + 6 overloads member AddOrUpdate: key: 'TKey * addValueFactory: Func<'TKey,'TValue> * updateValueFactory: Func<'TKey,'TValue,'TValue> -> 'TValue + 2 overloads ...
<summary>Represents a thread-safe collection of key/value pairs that can be accessed by multiple threads concurrently.</summary>
<typeparam name="TKey">The type of the keys in the dictionary.</typeparam>
<typeparam name="TValue">The type of the values in the dictionary.</typeparam>


--------------------
ConcurrentDictionary() : ConcurrentDictionary<'TKey,'TValue>
ConcurrentDictionary(collection: Collections.Generic.KeyValuePair<'TKey,'TValue> seq) : ConcurrentDictionary<'TKey,'TValue>
ConcurrentDictionary(comparer: Collections.Generic.IEqualityComparer<'TKey>) : ConcurrentDictionary<'TKey,'TValue>
ConcurrentDictionary(collection: Collections.Generic.KeyValuePair<'TKey,'TValue> seq, comparer: Collections.Generic.IEqualityComparer<'TKey>) : ConcurrentDictionary<'TKey,'TValue>
ConcurrentDictionary(concurrencyLevel: int, capacity: int) : ConcurrentDictionary<'TKey,'TValue>
ConcurrentDictionary(concurrencyLevel: int, collection: Collections.Generic.KeyValuePair<'TKey,'TValue> seq, comparer: Collections.Generic.IEqualityComparer<'TKey>) : ConcurrentDictionary<'TKey,'TValue>
ConcurrentDictionary(concurrencyLevel: int, capacity: int, comparer: Collections.Generic.IEqualityComparer<'TKey>) : ConcurrentDictionary<'TKey,'TValue>
val mutable lastId: int
Task.FromResult<'TResult>(result: 'TResult) : Task<'TResult>
ConcurrentDictionary.TryGetValue(key: int, value: byref<Order>) : bool
type Interlocked = static member Add: location1: byref<int> * value: int -> int + 3 overloads static member And: location1: byref<int> * value: int -> int + 3 overloads static member CompareExchange: location1: byref<float> * value: float * comparand: float -> float + 13 overloads static member Decrement: location: byref<int> -> int + 3 overloads static member Exchange: location1: byref<float> * value: float -> float + 13 overloads static member Increment: location: byref<int> -> int + 3 overloads static member MemoryBarrier: unit -> unit static member MemoryBarrierProcessWide: unit -> unit static member Or: location1: byref<int> * value: int -> int + 3 overloads static member Read: location: inref<int64> -> int64 + 1 overload
<summary>Provides atomic operations for variables that are shared by multiple threads.</summary>
Interlocked.Increment(location: byref<uint64>) : uint64
Interlocked.Increment(location: byref<uint32>) : uint32
Interlocked.Increment(location: byref<int64>) : int64
Interlocked.Increment(location: byref<int>) : int
val created: Order
NewOrder.Product: string
val tryApi: addServices: (IServiceCollection -> unit) -> mapRoutes: (WebApplication -> unit) -> unit
val addServices: (IServiceCollection -> unit)
type IServiceCollection = inherit IList<ServiceDescriptor> inherit ICollection<ServiceDescriptor> inherit seq<ServiceDescriptor> inherit IEnumerable
type unit = Unit
val mapRoutes: (WebApplication -> unit)
type WebApplication = interface IHost interface IDisposable interface IApplicationBuilder interface IEndpointRouteBuilder interface IAsyncDisposable member DisposeAsync: unit -> ValueTask member Run: ?url: string -> unit member RunAsync: ?url: string -> Task member StartAsync: ?cancellationToken: CancellationToken -> Task member StopAsync: ?cancellationToken: CancellationToken -> Task ...
val builder: WebApplicationBuilder
WebApplication.CreateBuilder() : WebApplicationBuilder
WebApplication.CreateBuilder(options: WebApplicationOptions) : WebApplicationBuilder
WebApplication.CreateBuilder(args: string array) : WebApplicationBuilder
property WebApplicationBuilder.WebHost: ConfigureWebHostBuilder with get, set
(extension) IWebHostBuilder.UseTestServer() : IWebHostBuilder
(extension) IWebHostBuilder.UseTestServer(configureOptions: Action<TestServerOptions>) : IWebHostBuilder
val ignore: value: 'T -> unit
property WebApplicationBuilder.Logging: ILoggingBuilder with get
(extension) ILoggingBuilder.ClearProviders() : ILoggingBuilder
property WebApplicationBuilder.Services: IServiceCollection with get
(extension) IServiceCollection.AddSingleton<'TService,'TImplementation (requires reference type and reference type and 'TImplementation :> 'TService)>() : IServiceCollection
(extension) IServiceCollection.AddSingleton<'TService (requires reference type)>() : IServiceCollection
(extension) IServiceCollection.AddSingleton( serviceType: Type) : IServiceCollection
(extension) IServiceCollection.AddSingleton<'TService (requires reference type)>(implementationFactory: Func<IServiceProvider,'TService>) : IServiceCollection
(extension) IServiceCollection.AddSingleton<'TService,'TImplementation (requires reference type and reference type and 'TImplementation :> 'TService)>(implementationFactory: Func<IServiceProvider,'TImplementation>) : IServiceCollection
(extension) IServiceCollection.AddSingleton<'TService (requires reference type)>(implementationInstance: 'TService) : IServiceCollection
(extension) IServiceCollection.AddSingleton(serviceType: Type, implementationType: Type) : IServiceCollection
(extension) IServiceCollection.AddSingleton(serviceType: Type, implementationFactory: Func<IServiceProvider,obj>) : IServiceCollection
(extension) IServiceCollection.AddSingleton(serviceType: Type, implementationInstance: obj) : IServiceCollection
val app: WebApplication
WebApplicationBuilder.Build() : WebApplication
WebApplication.StartAsync(?cancellationToken: CancellationToken) : Task
val client: HttpClient
(extension) Extensions.Hosting.IHost.GetTestClient() : HttpClient
val show: request: string -> response: HttpResponseMessage -> unit
val request: string
val response: HttpResponseMessage
Multiple items
type HttpResponseMessage = interface IDisposable new: unit -> unit + 1 overload member Dispose: unit -> unit member EnsureSuccessStatusCode: unit -> HttpResponseMessage member ToString: unit -> string member Content: HttpContent member Headers: HttpResponseHeaders member IsSuccessStatusCode: bool member ReasonPhrase: string member RequestMessage: HttpRequestMessage ...
<summary>Represents a HTTP response message including the status code and data.</summary>

--------------------
HttpResponseMessage() : HttpResponseMessage
HttpResponseMessage(statusCode: Net.HttpStatusCode) : HttpResponseMessage
val body: string
property HttpResponseMessage.Content: HttpContent with get, set
<summary>Gets or sets the content of a HTTP response message.</summary>
<returns>The content of the HTTP response message.</returns>
HttpContent.ReadAsStringAsync() : Task<string>
HttpContent.ReadAsStringAsync(cancellationToken: CancellationToken) : Task<string>
Multiple items
module Result from Microsoft.FSharp.Core

--------------------
type Result<'T,'TError> = | Ok of ResultValue: 'T | Error of ErrorValue: 'TError
val printfn: format: Printf.TextWriterFormat<'T> -> 'T
property HttpResponseMessage.StatusCode: Net.HttpStatusCode with get, set
<summary>Gets or sets the status code of the HTTP response.</summary>
<returns>The status code of the HTTP response.</returns>
HttpClient.GetAsync(requestUri: Uri) : Task<HttpResponseMessage>
HttpClient.GetAsync( requestUri: string) : Task<HttpResponseMessage>
HttpClient.GetAsync(requestUri: Uri, cancellationToken: CancellationToken) : Task<HttpResponseMessage>
HttpClient.GetAsync(requestUri: Uri, completionOption: HttpCompletionOption) : Task<HttpResponseMessage>
HttpClient.GetAsync( requestUri: string, cancellationToken: CancellationToken) : Task<HttpResponseMessage>
HttpClient.GetAsync( requestUri: string, completionOption: HttpCompletionOption) : Task<HttpResponseMessage>
HttpClient.GetAsync(requestUri: Uri, completionOption: HttpCompletionOption, cancellationToken: CancellationToken) : Task<HttpResponseMessage>
HttpClient.GetAsync( requestUri: string, completionOption: HttpCompletionOption, cancellationToken: CancellationToken) : Task<HttpResponseMessage>
(extension) HttpClient.PostAsJsonAsync<'TValue>( requestUri: string, value: 'TValue, cancellationToken: CancellationToken) : Task<HttpResponseMessage>
(extension) HttpClient.PostAsJsonAsync<'TValue>(requestUri: Uri, value: 'TValue, cancellationToken: CancellationToken) : Task<HttpResponseMessage>
(extension) HttpClient.PostAsJsonAsync<'TValue>( requestUri: string, value: 'TValue, ?options: Text.Json.JsonSerializerOptions, ?cancellationToken: CancellationToken) : Task<HttpResponseMessage>
(extension) HttpClient.PostAsJsonAsync<'TValue>( requestUri: string, value: 'TValue, jsonTypeInfo: Text.Json.Serialization.Metadata.JsonTypeInfo<'TValue>, ?cancellationToken: CancellationToken) : Task<HttpResponseMessage>
(extension) HttpClient.PostAsJsonAsync<'TValue>(requestUri: Uri, value: 'TValue, ?options: Text.Json.JsonSerializerOptions, ?cancellationToken: CancellationToken) : Task<HttpResponseMessage>
(extension) HttpClient.PostAsJsonAsync<'TValue>(requestUri: Uri, value: 'TValue, jsonTypeInfo: Text.Json.Serialization.Metadata.JsonTypeInfo<'TValue>, ?cancellationToken: CancellationToken) : Task<HttpResponseMessage>
WebApplication.StopAsync(?cancellationToken: CancellationToken) : Task
Multiple items
type OrderService = new: store: IOrderStore -> OrderService member Create: order: NewOrder -> Task<Result<Order,OrderError>> member Get: id: int -> Task<Order option>

--------------------
new: store: IOrderStore -> OrderService
val store: IOrderStore
val task: TaskBuilder
union case Result.Ok: ResultValue: 'T -> Result<'T,'TError>
val mapOrders: app: WebApplication -> unit
(extension) AspNetCore.Routing.IEndpointRouteBuilder.MapGet( pattern: string, requestDelegate: RequestDelegate) : IEndpointConventionBuilder
(extension) AspNetCore.Routing.IEndpointRouteBuilder.MapGet( pattern: string, handler: Delegate) : RouteHandlerBuilder
Multiple items
type Func<'TResult (allows ref struct)> = new: object: obj * method: nativeint -> unit member BeginInvoke: callback: AsyncCallback * object: obj -> IAsyncResult member EndInvoke: result: IAsyncResult -> 'TResult member Invoke: unit -> 'TResult
<summary>Encapsulates a method that has no parameters and returns a value of the type specified by the <typeparamref name="TResult" /> parameter.</summary>
<typeparam name="TResult">The type of the return value of the method that this delegate encapsulates.</typeparam>
<returns>The return value of the method that this delegate encapsulates.</returns>


--------------------
type Func<'T,'TResult (allows ref struct and allows ref struct)> = new: object: obj * method: nativeint -> unit member BeginInvoke: arg: 'T * callback: AsyncCallback * object: obj -> IAsyncResult member EndInvoke: result: IAsyncResult -> 'TResult member Invoke: arg: 'T -> 'TResult
<summary>Encapsulates a method that has one parameter and returns a value of the type specified by the <typeparamref name="TResult" /> parameter.</summary>
<param name="arg">The parameter of the method that this delegate encapsulates.</param>
<typeparam name="T">The type of the parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="TResult">The type of the return value of the method that this delegate encapsulates.</typeparam>
<returns>The return value of the method that this delegate encapsulates.</returns>


--------------------
type Func<'T1,'T2,'TResult (allows ref struct and allows ref struct and allows ref struct)> = new: object: obj * method: nativeint -> unit member BeginInvoke: arg1: 'T1 * arg2: 'T2 * callback: AsyncCallback * object: obj -> IAsyncResult member EndInvoke: result: IAsyncResult -> 'TResult member Invoke: arg1: 'T1 * arg2: 'T2 -> 'TResult
<summary>Encapsulates a method that has two parameters and returns a value of the type specified by the <typeparamref name="TResult" /> parameter.</summary>
<param name="arg1">The first parameter of the method that this delegate encapsulates.</param>
<param name="arg2">The second parameter of the method that this delegate encapsulates.</param>
<typeparam name="T1">The type of the first parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T2">The type of the second parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="TResult">The type of the return value of the method that this delegate encapsulates.</typeparam>
<returns>The return value of the method that this delegate encapsulates.</returns>


--------------------
type Func<'T1,'T2,'T3,'TResult (allows ref struct and allows ref struct and allows ref struct and allows ref struct)> = new: object: obj * method: nativeint -> unit member BeginInvoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * callback: AsyncCallback * object: obj -> IAsyncResult member EndInvoke: result: IAsyncResult -> 'TResult member Invoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 -> 'TResult
<summary>Encapsulates a method that has three parameters and returns a value of the type specified by the <typeparamref name="TResult" /> parameter.</summary>
<param name="arg1">The first parameter of the method that this delegate encapsulates.</param>
<param name="arg2">The second parameter of the method that this delegate encapsulates.</param>
<param name="arg3">The third parameter of the method that this delegate encapsulates.</param>
<typeparam name="T1">The type of the first parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T2">The type of the second parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T3">The type of the third parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="TResult">The type of the return value of the method that this delegate encapsulates.</typeparam>
<returns>The return value of the method that this delegate encapsulates.</returns>


--------------------
type Func<'T1,'T2,'T3,'T4,'TResult (allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct)> = new: object: obj * method: nativeint -> unit member BeginInvoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * callback: AsyncCallback * object: obj -> IAsyncResult member EndInvoke: result: IAsyncResult -> 'TResult member Invoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 -> 'TResult
<summary>Encapsulates a method that has four parameters and returns a value of the type specified by the <typeparamref name="TResult" /> parameter.</summary>
<param name="arg1">The first parameter of the method that this delegate encapsulates.</param>
<param name="arg2">The second parameter of the method that this delegate encapsulates.</param>
<param name="arg3">The third parameter of the method that this delegate encapsulates.</param>
<param name="arg4">The fourth parameter of the method that this delegate encapsulates.</param>
<typeparam name="T1">The type of the first parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T2">The type of the second parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T3">The type of the third parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T4">The type of the fourth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="TResult">The type of the return value of the method that this delegate encapsulates.</typeparam>
<returns>The return value of the method that this delegate encapsulates.</returns>


--------------------
type Func<'T1,'T2,'T3,'T4,'T5,'TResult (allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct)> = new: object: obj * method: nativeint -> unit member BeginInvoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 * callback: AsyncCallback * object: obj -> IAsyncResult member EndInvoke: result: IAsyncResult -> 'TResult member Invoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 -> 'TResult
<summary>Encapsulates a method that has five parameters and returns a value of the type specified by the <typeparamref name="TResult" /> parameter.</summary>
<param name="arg1">The first parameter of the method that this delegate encapsulates.</param>
<param name="arg2">The second parameter of the method that this delegate encapsulates.</param>
<param name="arg3">The third parameter of the method that this delegate encapsulates.</param>
<param name="arg4">The fourth parameter of the method that this delegate encapsulates.</param>
<param name="arg5">The fifth parameter of the method that this delegate encapsulates.</param>
<typeparam name="T1">The type of the first parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T2">The type of the second parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T3">The type of the third parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T4">The type of the fourth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T5">The type of the fifth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="TResult">The type of the return value of the method that this delegate encapsulates.</typeparam>
<returns>The return value of the method that this delegate encapsulates.</returns>


--------------------
type Func<'T1,'T2,'T3,'T4,'T5,'T6,'TResult (allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct)> = new: object: obj * method: nativeint -> unit member BeginInvoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 * arg6: 'T6 * callback: AsyncCallback * object: obj -> IAsyncResult member EndInvoke: result: IAsyncResult -> 'TResult member Invoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 * arg6: 'T6 -> 'TResult
<summary>Encapsulates a method that has six parameters and returns a value of the type specified by the <typeparamref name="TResult" /> parameter.</summary>
<param name="arg1">The first parameter of the method that this delegate encapsulates.</param>
<param name="arg2">The second parameter of the method that this delegate encapsulates.</param>
<param name="arg3">The third parameter of the method that this delegate encapsulates.</param>
<param name="arg4">The fourth parameter of the method that this delegate encapsulates.</param>
<param name="arg5">The fifth parameter of the method that this delegate encapsulates.</param>
<param name="arg6">The sixth parameter of the method that this delegate encapsulates.</param>
<typeparam name="T1">The type of the first parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T2">The type of the second parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T3">The type of the third parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T4">The type of the fourth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T5">The type of the fifth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T6">The type of the sixth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="TResult">The type of the return value of the method that this delegate encapsulates.</typeparam>
<returns>The return value of the method that this delegate encapsulates.</returns>


--------------------
type Func<'T1,'T2,'T3,'T4,'T5,'T6,'T7,'TResult (allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct)> = new: object: obj * method: nativeint -> unit member BeginInvoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 * arg6: 'T6 * arg7: 'T7 * callback: AsyncCallback * object: obj -> IAsyncResult member EndInvoke: result: IAsyncResult -> 'TResult member Invoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 * arg6: 'T6 * arg7: 'T7 -> 'TResult
<summary>Encapsulates a method that has seven parameters and returns a value of the type specified by the <typeparamref name="TResult" /> parameter.</summary>
<param name="arg1">The first parameter of the method that this delegate encapsulates.</param>
<param name="arg2">The second parameter of the method that this delegate encapsulates.</param>
<param name="arg3">The third parameter of the method that this delegate encapsulates.</param>
<param name="arg4">The fourth parameter of the method that this delegate encapsulates.</param>
<param name="arg5">The fifth parameter of the method that this delegate encapsulates.</param>
<param name="arg6">The sixth parameter of the method that this delegate encapsulates.</param>
<param name="arg7">The seventh parameter of the method that this delegate encapsulates.</param>
<typeparam name="T1">The type of the first parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T2">The type of the second parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T3">The type of the third parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T4">The type of the fourth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T5">The type of the fifth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T6">The type of the sixth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T7">The type of the seventh parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="TResult">The type of the return value of the method that this delegate encapsulates.</typeparam>
<returns>The return value of the method that this delegate encapsulates.</returns>


--------------------
type Func<'T1,'T2,'T3,'T4,'T5,'T6,'T7,'T8,'TResult (allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct)> = new: object: obj * method: nativeint -> unit member BeginInvoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 * arg6: 'T6 * arg7: 'T7 * arg8: 'T8 * callback: AsyncCallback * object: obj -> IAsyncResult member EndInvoke: result: IAsyncResult -> 'TResult member Invoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 * arg6: 'T6 * arg7: 'T7 * arg8: 'T8 -> 'TResult
<summary>Encapsulates a method that has eight parameters and returns a value of the type specified by the <typeparamref name="TResult" /> parameter.</summary>
<param name="arg1">The first parameter of the method that this delegate encapsulates.</param>
<param name="arg2">The second parameter of the method that this delegate encapsulates.</param>
<param name="arg3">The third parameter of the method that this delegate encapsulates.</param>
<param name="arg4">The fourth parameter of the method that this delegate encapsulates.</param>
<param name="arg5">The fifth parameter of the method that this delegate encapsulates.</param>
<param name="arg6">The sixth parameter of the method that this delegate encapsulates.</param>
<param name="arg7">The seventh parameter of the method that this delegate encapsulates.</param>
<param name="arg8">The eighth parameter of the method that this delegate encapsulates.</param>
<typeparam name="T1">The type of the first parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T2">The type of the second parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T3">The type of the third parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T4">The type of the fourth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T5">The type of the fifth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T6">The type of the sixth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T7">The type of the seventh parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T8">The type of the eighth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="TResult">The type of the return value of the method that this delegate encapsulates.</typeparam>
<returns>The return value of the method that this delegate encapsulates.</returns>


--------------------
type Func<'T1,'T2,'T3,'T4,'T5,'T6,'T7,'T8,'T9,'TResult (allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct)> = new: object: obj * method: nativeint -> unit member BeginInvoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 * arg6: 'T6 * arg7: 'T7 * arg8: 'T8 * arg9: 'T9 * callback: AsyncCallback * object: obj -> IAsyncResult member EndInvoke: result: IAsyncResult -> 'TResult member Invoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 * arg6: 'T6 * arg7: 'T7 * arg8: 'T8 * arg9: 'T9 -> 'TResult
<summary>Encapsulates a method that has nine parameters and returns a value of the type specified by the <typeparamref name="TResult" /> parameter.</summary>
<param name="arg1">The first parameter of the method that this delegate encapsulates.</param>
<param name="arg2">The second parameter of the method that this delegate encapsulates.</param>
<param name="arg3">The third parameter of the method that this delegate encapsulates.</param>
<param name="arg4">The fourth parameter of the method that this delegate encapsulates.</param>
<param name="arg5">The fifth parameter of the method that this delegate encapsulates.</param>
<param name="arg6">The sixth parameter of the method that this delegate encapsulates.</param>
<param name="arg7">The seventh parameter of the method that this delegate encapsulates.</param>
<param name="arg8">The eighth parameter of the method that this delegate encapsulates.</param>
<param name="arg9">The ninth parameter of the method that this delegate encapsulates.</param>
<typeparam name="T1">The type of the first parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T2">The type of the second parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T3">The type of the third parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T4">The type of the fourth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T5">The type of the fifth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T6">The type of the sixth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T7">The type of the seventh parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T8">The type of the eighth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T9">The type of the ninth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="TResult">The type of the return value of the method that this delegate encapsulates.</typeparam>
<returns>The return value of the method that this delegate encapsulates.</returns>


--------------------
type Func<'T1,'T2,'T3,'T4,'T5,'T6,'T7,'T8,'T9,'T10,'TResult (allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct)> = new: object: obj * method: nativeint -> unit member BeginInvoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 * arg6: 'T6 * arg7: 'T7 * arg8: 'T8 * arg9: 'T9 * arg10: 'T10 * callback: AsyncCallback * object: obj -> IAsyncResult member EndInvoke: result: IAsyncResult -> 'TResult member Invoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 * arg6: 'T6 * arg7: 'T7 * arg8: 'T8 * arg9: 'T9 * arg10: 'T10 -> 'TResult
<summary>Encapsulates a method that has 10 parameters and returns a value of the type specified by the <typeparamref name="TResult" /> parameter.</summary>
<param name="arg1">The first parameter of the method that this delegate encapsulates.</param>
<param name="arg2">The second parameter of the method that this delegate encapsulates.</param>
<param name="arg3">The third parameter of the method that this delegate encapsulates.</param>
<param name="arg4">The fourth parameter of the method that this delegate encapsulates.</param>
<param name="arg5">The fifth parameter of the method that this delegate encapsulates.</param>
<param name="arg6">The sixth parameter of the method that this delegate encapsulates.</param>
<param name="arg7">The seventh parameter of the method that this delegate encapsulates.</param>
<param name="arg8">The eighth parameter of the method that this delegate encapsulates.</param>
<param name="arg9">The ninth parameter of the method that this delegate encapsulates.</param>
<param name="arg10">The tenth parameter of the method that this delegate encapsulates.</param>
<typeparam name="T1">The type of the first parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T2">The type of the second parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T3">The type of the third parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T4">The type of the fourth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T5">The type of the fifth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T6">The type of the sixth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T7">The type of the seventh parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T8">The type of the eighth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T9">The type of the ninth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T10">The type of the tenth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="TResult">The type of the return value of the method that this delegate encapsulates.</typeparam>
<returns>The return value of the method that this delegate encapsulates.</returns>


--------------------
type Func<'T1,'T2,'T3,'T4,'T5,'T6,'T7,'T8,'T9,'T10,'T11,'TResult (allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct)> = new: object: obj * method: nativeint -> unit member BeginInvoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 * arg6: 'T6 * arg7: 'T7 * arg8: 'T8 * arg9: 'T9 * arg10: 'T10 * arg11: 'T11 * callback: AsyncCallback * object: obj -> IAsyncResult member EndInvoke: result: IAsyncResult -> 'TResult member Invoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 * arg6: 'T6 * arg7: 'T7 * arg8: 'T8 * arg9: 'T9 * arg10: 'T10 * arg11: 'T11 -> 'TResult
<summary>Encapsulates a method that has 11 parameters and returns a value of the type specified by the <typeparamref name="TResult" /> parameter.</summary>
<param name="arg1">The first parameter of the method that this delegate encapsulates.</param>
<param name="arg2">The second parameter of the method that this delegate encapsulates.</param>
<param name="arg3">The third parameter of the method that this delegate encapsulates.</param>
<param name="arg4">The fourth parameter of the method that this delegate encapsulates.</param>
<param name="arg5">The fifth parameter of the method that this delegate encapsulates.</param>
<param name="arg6">The sixth parameter of the method that this delegate encapsulates.</param>
<param name="arg7">The seventh parameter of the method that this delegate encapsulates.</param>
<param name="arg8">The eighth parameter of the method that this delegate encapsulates.</param>
<param name="arg9">The ninth parameter of the method that this delegate encapsulates.</param>
<param name="arg10">The tenth parameter of the method that this delegate encapsulates.</param>
<param name="arg11">The eleventh parameter of the method that this delegate encapsulates.</param>
<typeparam name="T1">The type of the first parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T2">The type of the second parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T3">The type of the third parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T4">The type of the fourth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T5">The type of the fifth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T6">The type of the sixth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T7">The type of the seventh parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T8">The type of the eighth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T9">The type of the ninth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T10">The type of the tenth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T11">The type of the eleventh parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="TResult">The type of the return value of the method that this delegate encapsulates.</typeparam>
<returns>The return value of the method that this delegate encapsulates.</returns>


--------------------
type Func<'T1,'T2,'T3,'T4,'T5,'T6,'T7,'T8,'T9,'T10,'T11,'T12,'TResult (allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct)> = new: object: obj * method: nativeint -> unit member BeginInvoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 * arg6: 'T6 * arg7: 'T7 * arg8: 'T8 * arg9: 'T9 * arg10: 'T10 * arg11: 'T11 * arg12: 'T12 * callback: AsyncCallback * object: obj -> IAsyncResult member EndInvoke: result: IAsyncResult -> 'TResult member Invoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 * arg6: 'T6 * arg7: 'T7 * arg8: 'T8 * arg9: 'T9 * arg10: 'T10 * arg11: 'T11 * arg12: 'T12 -> 'TResult
<summary>Encapsulates a method that has 12 parameters and returns a value of the type specified by the <typeparamref name="TResult" /> parameter.</summary>
<param name="arg1">The first parameter of the method that this delegate encapsulates.</param>
<param name="arg2">The second parameter of the method that this delegate encapsulates.</param>
<param name="arg3">The third parameter of the method that this delegate encapsulates.</param>
<param name="arg4">The fourth parameter of the method that this delegate encapsulates.</param>
<param name="arg5">The fifth parameter of the method that this delegate encapsulates.</param>
<param name="arg6">The sixth parameter of the method that this delegate encapsulates.</param>
<param name="arg7">The seventh parameter of the method that this delegate encapsulates.</param>
<param name="arg8">The eighth parameter of the method that this delegate encapsulates.</param>
<param name="arg9">The ninth parameter of the method that this delegate encapsulates.</param>
<param name="arg10">The tenth parameter of the method that this delegate encapsulates.</param>
<param name="arg11">The eleventh parameter of the method that this delegate encapsulates.</param>
<param name="arg12">The twelfth parameter of the method that this delegate encapsulates.</param>
<typeparam name="T1">The type of the first parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T2">The type of the second parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T3">The type of the third parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T4">The type of the fourth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T5">The type of the fifth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T6">The type of the sixth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T7">The type of the seventh parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T8">The type of the eighth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T9">The type of the ninth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T10">The type of the tenth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T11">The type of the eleventh parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T12">The type of the twelfth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="TResult">The type of the return value of the method that this delegate encapsulates.</typeparam>
<returns>The return value of the method that this delegate encapsulates.</returns>


--------------------
type Func<'T1,'T2,'T3,'T4,'T5,'T6,'T7,'T8,'T9,'T10,'T11,'T12,'T13,'TResult (allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct)> = new: object: obj * method: nativeint -> unit member BeginInvoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 * arg6: 'T6 * arg7: 'T7 * arg8: 'T8 * arg9: 'T9 * arg10: 'T10 * arg11: 'T11 * arg12: 'T12 * arg13: 'T13 * callback: AsyncCallback * object: obj -> IAsyncResult member EndInvoke: result: IAsyncResult -> 'TResult member Invoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 * arg6: 'T6 * arg7: 'T7 * arg8: 'T8 * arg9: 'T9 * arg10: 'T10 * arg11: 'T11 * arg12: 'T12 * arg13: 'T13 -> 'TResult
<summary>Encapsulates a method that has 13 parameters and returns a value of the type specified by the <typeparamref name="TResult" /> parameter.</summary>
<param name="arg1">The first parameter of the method that this delegate encapsulates.</param>
<param name="arg2">The second parameter of the method that this delegate encapsulates.</param>
<param name="arg3">The third parameter of the method that this delegate encapsulates.</param>
<param name="arg4">The fourth parameter of the method that this delegate encapsulates.</param>
<param name="arg5">The fifth parameter of the method that this delegate encapsulates.</param>
<param name="arg6">The sixth parameter of the method that this delegate encapsulates.</param>
<param name="arg7">The seventh parameter of the method that this delegate encapsulates.</param>
<param name="arg8">The eighth parameter of the method that this delegate encapsulates.</param>
<param name="arg9">The ninth parameter of the method that this delegate encapsulates.</param>
<param name="arg10">The tenth parameter of the method that this delegate encapsulates.</param>
<param name="arg11">The eleventh parameter of the method that this delegate encapsulates.</param>
<param name="arg12">The twelfth parameter of the method that this delegate encapsulates.</param>
<param name="arg13">The thirteenth parameter of the method that this delegate encapsulates.</param>
<typeparam name="T1">The type of the first parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T2">The type of the second parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T3">The type of the third parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T4">The type of the fourth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T5">The type of the fifth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T6">The type of the sixth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T7">The type of the seventh parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T8">The type of the eighth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T9">The type of the ninth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T10">The type of the tenth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T11">The type of the eleventh parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T12">The type of the twelfth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T13">The type of the thirteenth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="TResult">The type of the return value of the method that this delegate encapsulates.</typeparam>
<returns>The return value of the method that this delegate encapsulates.</returns>


--------------------
type Func<'T1,'T2,'T3,'T4,'T5,'T6,'T7,'T8,'T9,'T10,'T11,'T12,'T13,'T14,'TResult (allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct)> = new: object: obj * method: nativeint -> unit member BeginInvoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 * arg6: 'T6 * arg7: 'T7 * arg8: 'T8 * arg9: 'T9 * arg10: 'T10 * arg11: 'T11 * arg12: 'T12 * arg13: 'T13 * arg14: 'T14 * callback: AsyncCallback * object: obj -> IAsyncResult member EndInvoke: result: IAsyncResult -> 'TResult member Invoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 * arg6: 'T6 * arg7: 'T7 * arg8: 'T8 * arg9: 'T9 * arg10: 'T10 * arg11: 'T11 * arg12: 'T12 * arg13: 'T13 * arg14: 'T14 -> 'TResult
<summary>Encapsulates a method that has 14 parameters and returns a value of the type specified by the <typeparamref name="TResult" /> parameter.</summary>
<param name="arg1">The first parameter of the method that this delegate encapsulates.</param>
<param name="arg2">The second parameter of the method that this delegate encapsulates.</param>
<param name="arg3">The third parameter of the method that this delegate encapsulates.</param>
<param name="arg4">The fourth parameter of the method that this delegate encapsulates.</param>
<param name="arg5">The fifth parameter of the method that this delegate encapsulates.</param>
<param name="arg6">The sixth parameter of the method that this delegate encapsulates.</param>
<param name="arg7">The seventh parameter of the method that this delegate encapsulates.</param>
<param name="arg8">The eighth parameter of the method that this delegate encapsulates.</param>
<param name="arg9">The ninth parameter of the method that this delegate encapsulates.</param>
<param name="arg10">The tenth parameter of the method that this delegate encapsulates.</param>
<param name="arg11">The eleventh parameter of the method that this delegate encapsulates.</param>
<param name="arg12">The twelfth parameter of the method that this delegate encapsulates.</param>
<param name="arg13">The thirteenth parameter of the method that this delegate encapsulates.</param>
<param name="arg14">The fourteenth parameter of the method that this delegate encapsulates.</param>
<typeparam name="T1">The type of the first parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T2">The type of the second parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T3">The type of the third parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T4">The type of the fourth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T5">The type of the fifth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T6">The type of the sixth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T7">The type of the seventh parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T8">The type of the eighth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T9">The type of the ninth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T10">The type of the tenth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T11">The type of the eleventh parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T12">The type of the twelfth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T13">The type of the thirteenth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T14">The type of the fourteenth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="TResult">The type of the return value of the method that this delegate encapsulates.</typeparam>
<returns>The return value of the method that this delegate encapsulates.</returns>


--------------------
type Func<'T1,'T2,'T3,'T4,'T5,'T6,'T7,'T8,'T9,'T10,'T11,'T12,'T13,'T14,'T15,'TResult (allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct)> = new: object: obj * method: nativeint -> unit member BeginInvoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 * arg6: 'T6 * arg7: 'T7 * arg8: 'T8 * arg9: 'T9 * arg10: 'T10 * arg11: 'T11 * arg12: 'T12 * arg13: 'T13 * arg14: 'T14 * arg15: 'T15 * callback: AsyncCallback * object: obj -> IAsyncResult member EndInvoke: result: IAsyncResult -> 'TResult member Invoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 * arg6: 'T6 * arg7: 'T7 * arg8: 'T8 * arg9: 'T9 * arg10: 'T10 * arg11: 'T11 * arg12: 'T12 * arg13: 'T13 * arg14: 'T14 * arg15: 'T15 -> 'TResult
<summary>Encapsulates a method that has 15 parameters and returns a value of the type specified by the <typeparamref name="TResult" /> parameter.</summary>
<param name="arg1">The first parameter of the method that this delegate encapsulates.</param>
<param name="arg2">The second parameter of the method that this delegate encapsulates.</param>
<param name="arg3">The third parameter of the method that this delegate encapsulates.</param>
<param name="arg4">The fourth parameter of the method that this delegate encapsulates.</param>
<param name="arg5">The fifth parameter of the method that this delegate encapsulates.</param>
<param name="arg6">The sixth parameter of the method that this delegate encapsulates.</param>
<param name="arg7">The seventh parameter of the method that this delegate encapsulates.</param>
<param name="arg8">The eighth parameter of the method that this delegate encapsulates.</param>
<param name="arg9">The ninth parameter of the method that this delegate encapsulates.</param>
<param name="arg10">The tenth parameter of the method that this delegate encapsulates.</param>
<param name="arg11">The eleventh parameter of the method that this delegate encapsulates.</param>
<param name="arg12">The twelfth parameter of the method that this delegate encapsulates.</param>
<param name="arg13">The thirteenth parameter of the method that this delegate encapsulates.</param>
<param name="arg14">The fourteenth parameter of the method that this delegate encapsulates.</param>
<param name="arg15">The fifteenth parameter of the method that this delegate encapsulates.</param>
<typeparam name="T1">The type of the first parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T2">The type of the second parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T3">The type of the third parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T4">The type of the fourth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T5">The type of the fifth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T6">The type of the sixth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T7">The type of the seventh parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T8">The type of the eighth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T9">The type of the ninth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T10">The type of the tenth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T11">The type of the eleventh parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T12">The type of the twelfth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T13">The type of the thirteenth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T14">The type of the fourteenth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T15">The type of the fifteenth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="TResult">The type of the return value of the method that this delegate encapsulates.</typeparam>
<returns>The return value of the method that this delegate encapsulates.</returns>


--------------------
type Func<'T1,'T2,'T3,'T4,'T5,'T6,'T7,'T8,'T9,'T10,'T11,'T12,'T13,'T14,'T15,'T16,'TResult (allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct and allows ref struct)> = new: object: obj * method: nativeint -> unit member BeginInvoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 * arg6: 'T6 * arg7: 'T7 * arg8: 'T8 * arg9: 'T9 * arg10: 'T10 * arg11: 'T11 * arg12: 'T12 * arg13: 'T13 * arg14: 'T14 * arg15: 'T15 * arg16: 'T16 * callback: AsyncCallback * object: obj -> IAsyncResult member EndInvoke: result: IAsyncResult -> 'TResult member Invoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 * arg6: 'T6 * arg7: 'T7 * arg8: 'T8 * arg9: 'T9 * arg10: 'T10 * arg11: 'T11 * arg12: 'T12 * arg13: 'T13 * arg14: 'T14 * arg15: 'T15 * arg16: 'T16 -> 'TResult
<summary>Encapsulates a method that has 16 parameters and returns a value of the type specified by the <typeparamref name="TResult" /> parameter.</summary>
<param name="arg1">The first parameter of the method that this delegate encapsulates.</param>
<param name="arg2">The second parameter of the method that this delegate encapsulates.</param>
<param name="arg3">The third parameter of the method that this delegate encapsulates.</param>
<param name="arg4">The fourth parameter of the method that this delegate encapsulates.</param>
<param name="arg5">The fifth parameter of the method that this delegate encapsulates.</param>
<param name="arg6">The sixth parameter of the method that this delegate encapsulates.</param>
<param name="arg7">The seventh parameter of the method that this delegate encapsulates.</param>
<param name="arg8">The eighth parameter of the method that this delegate encapsulates.</param>
<param name="arg9">The ninth parameter of the method that this delegate encapsulates.</param>
<param name="arg10">The tenth parameter of the method that this delegate encapsulates.</param>
<param name="arg11">The eleventh parameter of the method that this delegate encapsulates.</param>
<param name="arg12">The twelfth parameter of the method that this delegate encapsulates.</param>
<param name="arg13">The thirteenth parameter of the method that this delegate encapsulates.</param>
<param name="arg14">The fourteenth parameter of the method that this delegate encapsulates.</param>
<param name="arg15">The fifteenth parameter of the method that this delegate encapsulates.</param>
<param name="arg16">The sixteenth parameter of the method that this delegate encapsulates.</param>
<typeparam name="T1">The type of the first parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T2">The type of the second parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T3">The type of the third parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T4">The type of the fourth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T5">The type of the fifth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T6">The type of the sixth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T7">The type of the seventh parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T8">The type of the eighth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T9">The type of the ninth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T10">The type of the tenth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T11">The type of the eleventh parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T12">The type of the twelfth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T13">The type of the thirteenth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T14">The type of the fourteenth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T15">The type of the fifteenth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T16">The type of the sixteenth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="TResult">The type of the return value of the method that this delegate encapsulates.</typeparam>
<returns>The return value of the method that this delegate encapsulates.</returns>
type IResult = override ExecuteAsync: httpContext: HttpContext -> Task
val orders: OrderService
member OrderService.Get: id: int -> Task<Order option>
type Results = static member Accepted: ?uri: string * ?value: obj -> IResult + 1 overload static member AcceptedAtRoute: ?routeName: string * ?routeValues: obj * ?value: obj -> IResult + 3 overloads static member BadRequest: ?error: obj -> IResult + 1 overload static member Bytes: contents: byte array * ?contentType: string * ?fileDownloadName: string * ?enableRangeProcessing: bool * ?lastModified: Nullable<DateTimeOffset> * ?entityTag: EntityTagHeaderValue -> IResult + 1 overload static member Challenge: ?properties: AuthenticationProperties * ?authenticationSchemes: IList<string> -> IResult static member Conflict: ?error: obj -> IResult + 1 overload static member Content: content: string * contentType: string * contentEncoding: Encoding -> IResult + 2 overloads static member Created: unit -> IResult + 4 overloads static member CreatedAtRoute: ?routeName: string * ?routeValues: obj * ?value: obj -> IResult + 3 overloads static member File: fileContents: byte array * ?contentType: string * ?fileDownloadName: string * ?enableRangeProcessing: bool * ?lastModified: Nullable<DateTimeOffset> * ?entityTag: EntityTagHeaderValue -> IResult + 2 overloads ...
Results.Ok<'TValue>(value: 'TValue) : IResult
Results.Ok(?value: obj) : IResult
Results.NotFound<'TValue>(value: 'TValue) : IResult
Results.NotFound(?value: obj) : IResult
(extension) AspNetCore.Routing.IEndpointRouteBuilder.MapPost( pattern: string, requestDelegate: RequestDelegate) : IEndpointConventionBuilder
(extension) AspNetCore.Routing.IEndpointRouteBuilder.MapPost( pattern: string, handler: Delegate) : RouteHandlerBuilder
member OrderService.Create: order: NewOrder -> Task<Result<Order,OrderError>>
Results.Created() : IResult
Results.Created<'TValue>(uri: Uri, value: 'TValue) : IResult
Results.Created(uri: Uri, value: obj) : IResult
Results.Created<'TValue>(uri: string, value: 'TValue) : IResult
Results.Created(uri: string, value: obj) : IResult
Order.Id: int
val reason: string
Results.BadRequest<'TValue>(error: 'TValue) : IResult
Results.BadRequest(?error: obj) : IResult
val addServices: services: IServiceCollection -> unit
val services: IServiceCollection
(extension) IServiceCollection.AddScoped<'TService,'TImplementation (requires reference type and reference type and 'TImplementation :> 'TService)>() : IServiceCollection
(extension) IServiceCollection.AddScoped<'TService (requires reference type)>() : IServiceCollection
(extension) IServiceCollection.AddScoped( serviceType: Type) : IServiceCollection
(extension) IServiceCollection.AddScoped<'TService (requires reference type)>(implementationFactory: Func<IServiceProvider,'TService>) : IServiceCollection
(extension) IServiceCollection.AddScoped<'TService,'TImplementation (requires reference type and reference type and 'TImplementation :> 'TService)>(implementationFactory: Func<IServiceProvider,'TImplementation>) : IServiceCollection
(extension) IServiceCollection.AddScoped(serviceType: Type, implementationType: Type) : IServiceCollection
(extension) IServiceCollection.AddScoped(serviceType: Type, implementationFactory: Func<IServiceProvider,obj>) : IServiceCollection
module WithServices from Web-apis
val toResult: ok: ('a -> IResult) -> result: Result<'a,OrderError> -> IResult
val ok: ('a -> IResult)
val result: Result<'a,OrderError>
'a
val value: 'a
val result: Result<Order,OrderError>
val run: env: 'r -> e: Effect<'r,'a,'e> -> AsyncResult<'a,'e>
<summary> Starts the effect. </summary>
<typeparam name="'r"> The environment required to run the effect </typeparam>
<typeparam name="'a"> The resulting type when the effect runs successfully </typeparam>
<typeparam name="'e"> The resulting type when the effect fails</typeparam>
<param name="env">The environment needed to start the effect</param>
<param name="e">The effect to run</param>
<example><code lang="fsharp"> task { match! placeOrder order |&gt; Effect.run env with | Ok id -&gt; printfn $"Placed {id}" | Error err -&gt; printfn $"Failed: {err}" } </code></example>
module WithEffects from Web-apis
namespace Giraffe
val handleEffect: ok: ('a -> HttpFunc -> HttpContext -> HttpFuncResult) -> effect: Effect<AppEnv,'a,OrderError> -> next: HttpFunc -> ctx: HttpContext -> HttpFuncResult
val ok: ('a -> HttpFunc -> HttpContext -> HttpFuncResult)
type HttpHandler = HttpFunc -> HttpContext -> HttpFuncResult
<summary> A HTTP handler is the core building block of a Giraffe web application. It works similarly to ASP.NET Core's middleware where it is self responsible for invoking the next <see cref="HttpFunc" /> function of the pipeline or shortcircuit the execution by directly returning a <see cref="System.Threading.Tasks.Task" /> of HttpContext option. </summary>
val effect: Effect<AppEnv,'a,OrderError>
val next: HttpFunc
module RequestErrors from Giraffe.HttpStatusCodeHandlers
<summary> A collection of <see cref="HttpHandler" /> functions to return HTTP status code 4xx responses. </summary>
val NOT_FOUND: x: 'a -> (HttpFunc -> HttpContext -> HttpFuncResult)
val BAD_REQUEST: x: 'a -> (HttpFunc -> HttpContext -> HttpFuncResult)
val webApp: HttpHandler
val choose: handlers: HttpHandler list -> next: HttpFunc -> HttpFunc
<summary> Iterates through a list of <see cref="HttpHandler" /> functions and returns the result of the first <see cref="HttpHandler" /> of which the outcome is Some HttpContext. Please mind that all <see cref="HttpHandler" /> functions will get pre-evaluated at runtime by applying the next (HttpFunc) parameter to each handler. </summary>
<param name="handlers"></param>
<param name="next"></param>
<returns>A <see cref="HttpFunc" />.</returns>
val GET: HttpHandler
val routef: path: PrintfFormat<'a,'b,'c,'d,'T> -> routeHandler: ('T -> HttpFunc -> HttpContext -> HttpFuncResult) -> HttpHandler
<summary> Filters an incoming HTTP request based on the request path (case sensitive). If the route matches the incoming HTTP request then the arguments from the <see cref="Microsoft.FSharp.Core.PrintfFormat" /> will be automatically resolved and passed into the supplied routeHandler. Supported format chars** %b: bool %c: char %s: string %i: int %d: int64 %f: float/double %O: Guid </summary>
<param name="path">A format string representing the expected request path.</param>
<param name="routeHandler">A function which accepts a tuple 'T of the parsed arguments and returns a <see cref="HttpHandler" /> function which will subsequently deal with the request.</param>
<returns>A Giraffe <see cref="HttpHandler" /> function which can be composed into a bigger web application.</returns>
val json: dataObj: 'T -> HttpFunc -> ctx: HttpContext -> HttpFuncResult
<summary> Serializes an object to JSON and writes the output to the body of the HTTP response. It also sets the HTTP Content-Type header to application/json and sets the Content-Length header accordingly. The JSON serializer can be configured in the ASP.NET Core startup code by registering a custom class of type <see cref="Json.ISerializer" />. </summary>
<param name="dataObj">The object to be send back to the client.</param>
<param name="ctx"></param>
<typeparam name="'T"></typeparam>
<returns>A Giraffe <see cref="HttpHandler" /> function which can be composed into a bigger web application.</returns>
val POST: HttpHandler
val route: path: string -> next: HttpFunc -> ctx: HttpContext -> HttpFuncResult
<summary> Filters an incoming HTTP request based on the request path (case sensitive). </summary>
<param name="path">Request path.</param>
<param name="next"></param>
<param name="ctx"></param>
<returns>A Giraffe <see cref="HttpHandler" /> function which can be composed into a bigger web application.</returns>
val bindJson: f: ('T -> HttpFunc -> HttpContext -> HttpFuncResult) -> next: HttpFunc -> ctx: HttpContext -> HttpFuncResult
<summary> Parses a JSON payload into an instance of type 'T. </summary>
<param name="f">A function which accepts an object of type 'T and returns a <see cref="HttpHandler" /> function.</param>
<param name="next"></param>
<param name="ctx"></param>
<typeparam name="'T"></typeparam>
<returns>A Giraffe <see cref="HttpHandler" /> function which can be composed into a bigger web application.</returns>
module Successful from Giraffe.HttpStatusCodeHandlers
<summary> A collection of <see cref="HttpHandler" /> functions to return HTTP status code 2xx responses. </summary>
val CREATED: x: 'a -> (HttpFunc -> HttpContext -> HttpFuncResult)
static member ServiceCollectionExtensions.AddGiraffe: svc: IServiceCollection -> IServiceCollection
val mapRoutes: app: WebApplication -> unit
static member ApplicationBuilderExtensions.UseGiraffe: builder: IApplicationBuilder * handler: HttpHandler -> unit
module GiraffeApi from Web-apis
namespace Oxpecker
val handleEffect: ok: ('a -> HttpContext -> Task) -> effect: Effect<AppEnv,'a,OrderError> -> ctx: HttpContext -> Task
val ok: ('a -> HttpContext -> Task)
type EndpointHandler = HttpContext -> Task
static member HttpContextExtensions.SetStatusCode: ctx: HttpContext * httpStatusCode: int -> unit
static member HttpContextExtensions.WriteText: ctx: HttpContext * str: string -> Task
val created: order: Order -> ctx: HttpContext -> Task
static member HttpContextExtensions.WriteJson: ctx: HttpContext * value: 'T -> Task
val endpoints: Endpoint list
val GET: (Endpoint seq -> Endpoint)
val routef: path: PrintfFormat<'T,unit,unit,EndpointHandler> -> handler: 'T -> Endpoint (requires 'T: not null)
val json: value: 'T -> ctx: HttpContext -> Task
val POST: (Endpoint seq -> Endpoint)
val route: path: string -> handler: EndpointHandler -> Endpoint
val bindJson: f: ('T -> HttpContext -> Task) -> ctx: HttpContext -> Task
(extension) IServiceCollection.AddRouting() : IServiceCollection
(extension) IServiceCollection.AddRouting(configureOptions: Action<AspNetCore.Routing.RouteOptions>) : IServiceCollection
(extension) IApplicationBuilder.UseRouting() : IApplicationBuilder
module OxpeckerApi from Web-apis
namespace Orsak.AspNetCore
val effect: Effect<AppEnv,IResult,OrderError>
union case Runner.RunWith: (HttpContext -> AppEnv) -> Runner
val createEnv: (HttpContext -> AppEnv)
type RequestDelegate = new: object: obj * method: nativeint -> unit member BeginInvoke: context: HttpContext * callback: AsyncCallback * object: obj -> IAsyncResult member EndInvoke: result: IAsyncResult -> Task member Invoke: context: HttpContext -> Task
val result: Result<IResult,OrderError>
val response: IResult
val readJson: unit -> Effect<#IRequestProvider,'T,'b>
'T
val p: #IRequestProvider
property IRequestProvider.Context: HttpContext with get
property HttpContext.Request: HttpRequest with get
(extension) HttpRequest.ReadFromJsonAsync<'TValue>(?cancellationToken: CancellationToken) : ValueTask<'TValue>
(extension) HttpRequest.ReadFromJsonAsync<'TValue>(options: Text.Json.JsonSerializerOptions, ?cancellationToken: CancellationToken) : ValueTask<'TValue>
(extension) HttpRequest.ReadFromJsonAsync<'TValue>(jsonTypeInfo: Text.Json.Serialization.Metadata.JsonTypeInfo<'TValue>, ?cancellationToken: CancellationToken) : ValueTask<'TValue>
(extension) HttpRequest.ReadFromJsonAsync(jsonTypeInfo: Text.Json.Serialization.Metadata.JsonTypeInfo, ?cancellationToken: CancellationToken) : ValueTask<obj>
(extension) HttpRequest.ReadFromJsonAsync(``type`` : Type, ?cancellationToken: CancellationToken) : ValueTask<obj>
(extension) HttpRequest.ReadFromJsonAsync(``type`` : Type, options: Text.Json.JsonSerializerOptions, ?cancellationToken: CancellationToken) : ValueTask<obj>
(extension) HttpRequest.ReadFromJsonAsync(``type`` : Type, context: Text.Json.Serialization.JsonSerializerContext, ?cancellationToken: CancellationToken) : ValueTask<obj>
val getOrderEndpoint: id: int -> Effect<#IOrderStoreProvider,IResult,OrderError>
val postOrderEndpoint: unit -> Effect<'a,IResult,OrderError> (requires 'a :> IOrderStoreProvider and 'a :> IRequestProvider)
module Request from Web-apis.OrsakApi
val endpoints: AspNetCore.Routing.IEndpointRouteBuilder
val runner: Runner
static member EffectRunnerExtensions.MapEffectEndpoints: builder: AspNetCore.Routing.IEndpointRouteBuilder * endpoints: Endpoint list -> unit
static member EffectRunnerExtensions.RouteGet<'H,'Eff,'Printer,'T (requires member ( *>> ))> : this: 'H * path: PrintfFormat<'Printer,unit,unit,'Eff,'T> * routeHandler: Quotations.Expr<('T -> 'Eff)> -> Endpoint (requires member ( *>> ))
static member EffectRunnerExtensions.RoutePost<'a,'b,'c,'d (requires member ( *>> ))> : this: 'a * path: PrintfFormat<'c,unit,unit,'b,'d> * routeHandler: Quotations.Expr<('d -> 'b)> -> Endpoint (requires member ( *>> ))
module OrsakApi from Web-apis

Type something to start searching.