Hopac.Plus


Hopac.Plus

A collection of utilities that encapsulate common concurrency patterns and constructs for use with the Hopac concurrency library.

The Hopac.Plus library can be installed from NuGet:
PM> Install-Package Hopac.Plus

Extensions

Example using the functions in the Hopac.Plus.Extensions namespace:

 1: 
 2: 
 3: 
 4: 
 5: 
 6: 
 7: 
 8: 
 9: 
10: 
open Hopac
open Hopac.Plus.Extensions

OptionJob.create 42L
|> OptionJob.bindOpt (fun i -> if i % 2L = 0L then Some i else None)
|> Job.map (function Some x -> Choice1Of2 x | None -> Choice2Of2 "Not divisible by 2")
|> ChoiceJob.map (fun i -> i / 6L)
|> ChoiceJob.fold Some (fun _ -> None)
|> OptionJob.orDefaultJob Clock.getSecondsSinceEpoch
|> run

Result:

7L

SharedMap

Example using the SharedMap:

 1: 
 2: 
 3: 
 4: 
 5: 
 6: 
 7: 
 8: 
 9: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
25: 
open Hopac
open Hopac.Plus.Collections

let smap = run <| SharedMap.create ()

let printMap smap =
  SharedMap.freeze smap
  |> Job.map (printfn "%A")

let example smap = job {
  let key = "Example"
  do! SharedMap.add key 10 smap
  do! printMap smap

  do! SharedMap.add key 20 smap
  do! printMap smap

  do! SharedMap.mutate key ((*) 5) smap
  do! printMap smap

  do! SharedMap.remove key smap
  do! printMap smap
}

run <| example smap

Samples & documentation

The library comes with comprehensible documentation.

  • Tutorial contains a further explanation of this sample library.

  • API Reference contains automatically generated documentation for all types, modules and functions in the library. This includes additional brief samples on using most of the functions.

Contributing and copyright

The project is hosted on GitHub where you can report issues, fork the project and submit pull requests. If you're adding a new public API, please also consider adding samples that can be turned into a documentation. You might also want to read the library design notes to understand how it works.

The library is available under Apache 2.0 license, which allows modification and redistribution for both commercial and non-commercial purposes. For more information see the License file in the GitHub repository.

namespace Hopac
Multiple items
module Hopac

from Hopac

--------------------
namespace Hopac
namespace Hopac.Plus
namespace Hopac.Plus.Extensions
module OptionJob

from Hopac.Plus.Extensions
val create : x:'x -> Job<'x option>

Full name: Hopac.Plus.Extensions.OptionJob.create
val bindOpt : x2yO:('x -> 'y option) -> xOJ:Job<'x option> -> Job<'y option>

Full name: Hopac.Plus.Extensions.OptionJob.bindOpt
val i : int64
union case Option.Some: Value: 'T -> Option<'T>
union case Option.None: Option<'T>
type Job<'T> =

Full name: Hopac.Job<_>
val map : ('x -> 'y) -> Job<'x> -> Job<'y>

Full name: Hopac.Job.map
val x : int64
union case Choice.Choice1Of2: 'T1 -> Choice<'T1,'T2>
union case Choice.Choice2Of2: 'T2 -> Choice<'T1,'T2>
module ChoiceJob

from Hopac.Plus.Extensions
val map : x2a:('x -> 'a) -> xyCJ:Job<Choice<'x,'y>> -> Job<Choice<'a,'y>>

Full name: Hopac.Plus.Extensions.ChoiceJob.map
val fold : x2t:('x -> 't) -> y2t:('y -> 't) -> xyCJ:Job<Choice<'x,'y>> -> Job<'t>

Full name: Hopac.Plus.Extensions.ChoiceJob.fold
val orDefaultJob : xJ:Job<'x> -> xOJ:Job<'x option> -> Job<'x>

Full name: Hopac.Plus.Extensions.OptionJob.orDefaultJob
module Clock

from Hopac.Plus.Extensions
val getSecondsSinceEpoch : Job<SecondsSinceEpoch>

Full name: Hopac.Plus.Extensions.Clock.getSecondsSinceEpoch
val run : Job<'x> -> 'x

Full name: Hopac.Hopac.run
namespace Hopac.Plus.Collections
val smap : SharedMap<string,int>

Full name: Index.smap
Multiple items
module SharedMap

from Hopac.Plus.Collections

--------------------
type SharedMap<'k,'v (requires comparison)>

Full name: Hopac.Plus.Collections.SharedMap<_,_>
val create : unit -> Job<SharedMap<'k,'v>> (requires comparison)

Full name: Hopac.Plus.Collections.SharedMap.create
val printMap : smap:SharedMap<'a,'b> -> Job<unit> (requires comparison)

Full name: Index.printMap
val smap : SharedMap<'a,'b> (requires comparison)
val freeze : sm:SharedMap<'k,'v> -> Job<Map<'k,'v>> (requires comparison)

Full name: Hopac.Plus.Collections.SharedMap.freeze
val printfn : format:Printf.TextWriterFormat<'T> -> 'T

Full name: Microsoft.FSharp.Core.ExtraTopLevelOperators.printfn
val example : smap:SharedMap<string,int> -> Job<unit>

Full name: Index.example
val smap : SharedMap<string,int>
val job : JobBuilder

Full name: Hopac.Hopac.job
val key : string
val add : k:'k -> v:'v -> sm:SharedMap<'k,'v> -> Alt<unit> (requires comparison)

Full name: Hopac.Plus.Collections.SharedMap.add
val mutate : k:'k -> v2v:('v -> 'v) -> sm:SharedMap<'k,'v> -> Alt<unit> (requires comparison)

Full name: Hopac.Plus.Collections.SharedMap.mutate
val remove : k:'k -> sm:SharedMap<'k,'v> -> Alt<unit> (requires comparison)

Full name: Hopac.Plus.Collections.SharedMap.remove
Fork me on GitHub