Skip to content

Instantly share code, notes, and snippets.

@TheAngryByrd
Created December 24, 2024 16:59
Show Gist options
  • Save TheAngryByrd/b1f404cc8dfe843aab7d5afdfc99c111 to your computer and use it in GitHub Desktop.
Save TheAngryByrd/b1f404cc8dfe843aab7d5afdfc99c111 to your computer and use it in GitHub Desktop.
Choice Combining Result CE
type ResultBuilder () =
member inline _.Return (x) = Ok x
member inline _.Bind(x,f) =
match x with
| Ok x -> f x
| Error e -> Error <| e
member inline _.Bind(x: Result<_,_>,f: 'a -> Result<_,_>) =
match x with
| Ok x ->
match f x with
| Ok x -> Ok x
| Error (Choice1Of7 e) -> Choice1Of7 e |> Error
| Error (Choice2Of7 e) -> Choice2Of7 e |> Error
| Error (Choice3Of7 e) -> Choice3Of7 e |> Error
| Error (Choice4Of7 e) -> Choice4Of7 e |> Error
| Error (Choice5Of7 e) -> Choice5Of7 e |> Error
| Error (Choice6Of7 e) -> Choice6Of7 e |> Error
| Error (Choice7Of7 e) -> Choice7Of7 e |> Error
| Error (e) -> Error <| Choice7Of7 e
member inline _.Bind(x: Result<_,_>,f: 'a -> Result<_,_>) =
match x with
| Ok x ->
match f x with
| Ok x -> Ok x
| Error (Choice1Of7 e) -> Choice1Of7 e |> Error
| Error (Choice2Of7 e) -> Choice2Of7 e |> Error
| Error (Choice3Of7 e) -> Choice3Of7 e |> Error
| Error (Choice4Of7 e) -> Choice4Of7 e |> Error
| Error (Choice5Of7 e) -> Choice5Of7 e |> Error
| Error (Choice6Of7 e) -> Choice6Of7 e |> Error
| Error (Choice7Of7 e) -> Choice7Of7 e |> Error
| Error (e) -> Error <| Choice6Of7 e
member inline _.Bind(x: Result<_,_>,f: 'a -> Result<_,_>) =
match x with
| Ok x ->
match f x with
| Ok x -> Ok x
| Error (Choice1Of7 e) -> Choice1Of7 e |> Error
| Error (Choice2Of7 e) -> Choice2Of7 e |> Error
| Error (Choice3Of7 e) -> Choice3Of7 e |> Error
| Error (Choice4Of7 e) -> Choice4Of7 e |> Error
| Error (Choice5Of7 e) -> Choice5Of7 e |> Error
| Error (Choice6Of7 e) -> Choice6Of7 e |> Error
| Error (Choice7Of7 e) -> Choice7Of7 e |> Error
| Error (e) -> Error <| Choice5Of7 e
member inline _.Bind(x: Result<_,_>,f: 'a -> Result<_,_>) =
match x with
| Ok x ->
match f x with
| Ok x -> Ok x
| Error (Choice1Of7 e) -> Choice1Of7 e |> Error
| Error (Choice2Of7 e) -> Choice2Of7 e |> Error
| Error (Choice3Of7 e) -> Choice3Of7 e |> Error
| Error (Choice4Of7 e) -> Choice4Of7 e |> Error
| Error (Choice5Of7 e) -> Choice5Of7 e |> Error
| Error (Choice6Of7 e) -> Choice6Of7 e |> Error
| Error (Choice7Of7 e) -> Choice7Of7 e |> Error
| Error (e) -> Error <| Choice4Of7 e
member inline _.Bind(x: Result<_,_>,f: 'a -> Result<_,_>) =
match x with
| Ok x ->
match f x with
| Ok x -> Ok x
| Error (Choice1Of7 e) -> Choice1Of7 e |> Error
| Error (Choice2Of7 e) -> Choice2Of7 e |> Error
| Error (Choice3Of7 e) -> Choice3Of7 e |> Error
| Error (Choice4Of7 e) -> Choice4Of7 e |> Error
| Error (Choice5Of7 e) -> Choice5Of7 e |> Error
| Error (Choice6Of7 e) -> Choice6Of7 e |> Error
| Error (Choice7Of7 e) -> Choice7Of7 e |> Error
| Error (e) -> Error <| Choice3Of7 e
member inline _.Bind(x: Result<_,_>,f: 'a -> Result<_,_>) =
match x with
| Ok x ->
match f x with
| Ok x -> Ok x
| Error (Choice1Of7 e) -> Choice1Of7 e |> Error
| Error (Choice2Of7 e) -> Choice2Of7 e |> Error
| Error (Choice3Of7 e) -> Choice3Of7 e |> Error
| Error (Choice4Of7 e) -> Choice4Of7 e |> Error
| Error (Choice5Of7 e) -> Choice5Of7 e |> Error
| Error (Choice6Of7 e) -> Choice6Of7 e |> Error
| Error (Choice7Of7 e) -> Choice7Of7 e |> Error
| Error (e) -> Error <| Choice2Of7 e
member inline _.Bind(x: Result<_,_>,f: 'a -> Result<_,_>) =
match x with
| Ok x ->
match f x with
| Ok x -> Ok x
| Error (Choice1Of7 e) -> Choice1Of7 e |> Error
| Error (Choice2Of7 e) -> Choice2Of7 e |> Error
| Error (Choice3Of7 e) -> Choice3Of7 e |> Error
| Error (Choice4Of7 e) -> Choice4Of7 e |> Error
| Error (Choice5Of7 e) -> Choice5Of7 e |> Error
| Error (Choice6Of7 e) -> Choice6Of7 e |> Error
| Error (Choice7Of7 e) -> Choice7Of7 e |> Error
| Error (e) -> Error <| Choice1Of7 e
member inline _.Bind(x: Result<'a,_>,f: 'a -> Result<'d,_>) =
match x with
| Ok x ->
match f x with
| Ok x -> Ok x
| Error (Choice1Of6 e) -> Error <| Choice1Of6 e
| Error (Choice2Of6 e) -> Error <| Choice2Of6 e
| Error (Choice3Of6 e) -> Error <| Choice3Of6 e
| Error (Choice4Of6 e) -> Error <| Choice4Of6 e
| Error (Choice5Of6 e) -> Error <| Choice5Of6 e
| Error (Choice6Of6 e) -> Error <| Choice6Of6 e
| Error (e) -> Error <| Choice6Of6 e
member inline _.Bind(x: Result<'a,_>,f: 'a -> Result<'d,_>) =
match x with
| Ok x ->
match f x with
| Ok x -> Ok x
| Error (Choice1Of6 e) -> Error <| Choice1Of6 e
| Error (Choice2Of6 e) -> Error <| Choice2Of6 e
| Error (Choice3Of6 e) -> Error <| Choice3Of6 e
| Error (Choice4Of6 e) -> Error <| Choice4Of6 e
| Error (Choice5Of6 e) -> Error <| Choice5Of6 e
| Error (Choice6Of6 e) -> Error <| Choice6Of6 e
| Error (e) -> Error <| Choice5Of6 e
member inline _.Bind(x: Result<'a,_>,f: 'a -> Result<'d,_>) =
match x with
| Ok x ->
match f x with
| Ok x -> Ok x
| Error (Choice1Of6 e) -> Error <| Choice1Of6 e
| Error (Choice2Of6 e) -> Error <| Choice2Of6 e
| Error (Choice3Of6 e) -> Error <| Choice3Of6 e
| Error (Choice4Of6 e) -> Error <| Choice4Of6 e
| Error (Choice5Of6 e) -> Error <| Choice5Of6 e
| Error (Choice6Of6 e) -> Error <| Choice6Of6 e
| Error (e) -> Error <| Choice4Of6 e
member inline _.Bind(x: Result<'a,_>,f: 'a -> Result<'d,_>) =
match x with
| Ok x ->
match f x with
| Ok x -> Ok x
| Error (Choice1Of6 e) -> Error <| Choice1Of6 e
| Error (Choice2Of6 e) -> Error <| Choice2Of6 e
| Error (Choice3Of6 e) -> Error <| Choice3Of6 e
| Error (Choice4Of6 e) -> Error <| Choice4Of6 e
| Error (Choice5Of6 e) -> Error <| Choice5Of6 e
| Error (Choice6Of6 e) -> Error <| Choice6Of6 e
| Error (e) -> Error <| Choice3Of6 e
member inline _.Bind(x: Result<'a,_>,f: 'a -> Result<'d,_>) =
match x with
| Ok x ->
match f x with
| Ok x -> Ok x
| Error (Choice1Of6 e) -> Error <| Choice1Of6 e
| Error (Choice2Of6 e) -> Error <| Choice2Of6 e
| Error (Choice3Of6 e) -> Error <| Choice3Of6 e
| Error (Choice4Of6 e) -> Error <| Choice4Of6 e
| Error (Choice5Of6 e) -> Error <| Choice5Of6 e
| Error (Choice6Of6 e) -> Error <| Choice6Of6 e
| Error (e) -> Error <| Choice2Of6 e
member inline _.Bind(x: Result<'a,_>,f: 'a -> Result<'d,_>) =
match x with
| Ok x ->
match f x with
| Ok x -> Ok x
| Error (Choice1Of6 e) -> Error <| Choice1Of6 e
| Error (Choice2Of6 e) -> Error <| Choice2Of6 e
| Error (Choice3Of6 e) -> Error <| Choice3Of6 e
| Error (Choice4Of6 e) -> Error <| Choice4Of6 e
| Error (Choice5Of6 e) -> Error <| Choice5Of6 e
| Error (Choice6Of6 e) -> Error <| Choice6Of6 e
| Error (e) -> Error <| Choice1Of6 e
member inline _.Bind(x: Result<'a,_>,f: 'a -> Result<'d,_>) =
match x with
| Ok x ->
match f x with
| Ok x -> Ok x
| Error (Choice1Of5 e) -> Error <| Choice1Of5 e
| Error (Choice2Of5 e) -> Error <| Choice2Of5 e
| Error (Choice3Of5 e) -> Error <| Choice3Of5 e
| Error (Choice4Of5 e) -> Error <| Choice4Of5 e
| Error (Choice5Of5 e) -> Error <| Choice5Of5 e
| Error (e) -> Error <| Choice5Of5 e
member inline _.Bind(x: Result<'a,_>,f: 'a -> Result<'d,_>) =
match x with
| Ok x ->
match f x with
| Ok x -> Ok x
| Error (Choice1Of5 e) -> Error <| Choice1Of5 e
| Error (Choice2Of5 e) -> Error <| Choice2Of5 e
| Error (Choice3Of5 e) -> Error <| Choice3Of5 e
| Error (Choice4Of5 e) -> Error <| Choice4Of5 e
| Error (Choice5Of5 e) -> Error <| Choice5Of5 e
| Error (e) -> Error <| Choice4Of5 e
member inline _.Bind(x: Result<'a,_>,f: 'a -> Result<'d,_>) =
match x with
| Ok x ->
match f x with
| Ok x -> Ok x
| Error (Choice1Of5 e) -> Error <| Choice1Of5 e
| Error (Choice2Of5 e) -> Error <| Choice2Of5 e
| Error (Choice3Of5 e) -> Error <| Choice3Of5 e
| Error (Choice4Of5 e) -> Error <| Choice4Of5 e
| Error (Choice5Of5 e) -> Error <| Choice5Of5 e
| Error (e) -> Error <| Choice3Of5 e
member inline _.Bind(x: Result<'a,_>,f: 'a -> Result<'d,_>) =
match x with
| Ok x ->
match f x with
| Ok x -> Ok x
| Error (Choice1Of5 e) -> Error <| Choice1Of5 e
| Error (Choice2Of5 e) -> Error <| Choice2Of5 e
| Error (Choice3Of5 e) -> Error <| Choice3Of5 e
| Error (Choice4Of5 e) -> Error <| Choice4Of5 e
| Error (Choice5Of5 e) -> Error <| Choice5Of5 e
| Error (e) -> Error <| Choice2Of5 e
member inline _.Bind(x: Result<'a,_>,f: 'a -> Result<'d,_>) =
match x with
| Ok x ->
match f x with
| Ok x -> Ok x
| Error (Choice1Of5 e) -> Error <| Choice1Of5 e
| Error (Choice2Of5 e) -> Error <| Choice2Of5 e
| Error (Choice3Of5 e) -> Error <| Choice3Of5 e
| Error (Choice4Of5 e) -> Error <| Choice4Of5 e
| Error (Choice5Of5 e) -> Error <| Choice5Of5 e
| Error (e) -> Error <| Choice1Of5 e
member inline _.Bind(x: Result<'a,_>,f: 'a -> Result<'d,_>) =
match x with
| Ok x ->
match f x with
| Ok x -> Ok x
| Error (Choice1Of4 e) -> Error <| Choice1Of4 e
| Error (Choice2Of4 e) -> Error <| Choice2Of4 e
| Error (Choice3Of4 e) -> Error <| Choice3Of4 e
| Error (Choice4Of4 e) -> Error <| Choice4Of4 e
| Error (e) -> Error <| Choice4Of4 e
member inline _.Bind(x: Result<'a,_>,f: 'a -> Result<'d,_>) =
match x with
| Ok x ->
match f x with
| Ok x -> Ok x
| Error (Choice1Of4 e) -> Error <| Choice1Of4 e
| Error (Choice2Of4 e) -> Error <| Choice2Of4 e
| Error (Choice3Of4 e) -> Error <| Choice3Of4 e
| Error (Choice4Of4 e) -> Error <| Choice4Of4 e
| Error (e) -> Error <| Choice3Of4 e
member inline _.Bind(x: Result<'a,_>,f: 'a -> Result<'d,_>) =
match x with
| Ok x ->
match f x with
| Ok x -> Ok x
| Error (Choice1Of4 e) -> Error <| Choice1Of4 e
| Error (Choice2Of4 e) -> Error <| Choice2Of4 e
| Error (Choice3Of4 e) -> Error <| Choice3Of4 e
| Error (Choice4Of4 e) -> Error <| Choice4Of4 e
| Error (e) -> Error <| Choice2Of4 e
member inline _.Bind(x: Result<'a,_>,f: 'a -> Result<'d,_>) =
match x with
| Ok x ->
match f x with
| Ok x -> Ok x
| Error (Choice1Of4 e) -> Error <| Choice1Of4 e
| Error (Choice2Of4 e) -> Error <| Choice2Of4 e
| Error (Choice3Of4 e) -> Error <| Choice3Of4 e
| Error (Choice4Of4 e) -> Error <| Choice4Of4 e
| Error (e) -> Error <| Choice1Of4 e
member inline _.Bind(x: Result<'a,_>,f: 'a -> Result<'d,_>) =
match x with
| Ok x ->
match f x with
| Ok x -> Ok x
| Error (Choice1Of3 e) -> Error <| Choice1Of3 e
| Error (Choice2Of3 e) -> Error <| Choice2Of3 e
| Error (Choice3Of3 e) -> Error <| Choice3Of3 e
| Error (e) -> Error <| Choice1Of3 e
member inline _.Bind(x: Result<'a,_>,f: 'a -> Result<'d,_>) =
match x with
| Ok x ->
match f x with
| Ok x -> Ok x
| Error (Choice1Of3 e) -> Error <| Choice1Of3 e
| Error (Choice2Of3 e) -> Error <| Choice2Of3 e
| Error (Choice3Of3 e) -> Error <| Choice3Of3 e
| Error (e) -> Error <| Choice2Of3 e
member inline _.Bind(x: Result<'a,_>,f: 'a -> Result<'d,_>) =
match x with
| Ok x ->
match f x with
| Ok x -> Ok x
| Error (Choice1Of3 e) -> Error <| Choice1Of3 e
| Error (Choice2Of3 e) -> Error <| Choice2Of3 e
| Error (Choice3Of3 e) -> Error <| Choice3Of3 e
| Error (e) -> Error <| Choice3Of3 e
member inline _.Bind(x: Result<'a,_>,f: 'a -> Result<'d,_>) =
match x with
| Ok x ->
match f x with
| Ok x -> Ok x
| Error (Choice1Of2 e) -> Error <| Choice1Of2 e
| Error (Choice2Of2 e) -> Error <| Choice2Of2 e
| Error (e) -> Error <| Choice1Of2 e
member inline _.Bind(x: Result<'a,_>,f: 'a -> Result<'d,_>) =
match x with
| Ok x ->
match f x with
| Ok x -> Ok x
| Error (Choice1Of2 e) -> Error <| Choice1Of2 e
| Error (Choice2Of2 e) -> Error <| Choice2Of2 e
| Error (e) -> Error <| Choice2Of2 e
member _.BindReturn(x, f) =
match x with
| Ok x -> Ok (f x)
| Error e -> Error e
let result = ResultBuilder()
[<AutoOpen>]
module ResultBuilderExtensions =
type ResultBuilder with
member inline _.Bind(x: Result<'a,'b>,f: 'a -> Result<'d,'e>) =
match x with
| Ok x ->
match f x with
| Ok x -> Ok x
| Error e -> Error <| Choice2Of2 e
| Error (e) -> Error <| Choice1Of2 e
[<AutoOpen>]
module ResultBuilderExtensions2 =
type ResultBuilder with
member inline _.Bind(x: Result<'a,_>,f: 'a -> Result<'d,_>) =
match x with
| Ok x ->
match f x with
| Ok x -> Ok x
| Error (Choice1Of2 e) -> Error <| Choice2Of3 e
| Error (Choice2Of2 e) -> Error <| Choice3Of3 e
| Error (e) -> Error <| Choice1Of3 e
member inline _.Bind(x: Result<'a,_>,f: 'a -> Result<'d,_>) =
match x with
| Ok x ->
match f x with
| Ok x -> Ok x
| Error (Choice1Of3 e) -> Error <| Choice2Of4 e
| Error (Choice2Of3 e) -> Error <| Choice3Of4 e
| Error (Choice3Of3 e) -> Error <| Choice4Of4 e
| Error (e) -> Error <| Choice1Of4 e
member inline _.Bind(x: Result<'a,_>,f: 'a -> Result<'d,_>) =
match x with
| Ok x ->
match f x with
| Ok x -> Ok x
| Error (Choice1Of4 e) -> Error <| Choice2Of5 e
| Error (Choice2Of4 e) -> Error <| Choice3Of5 e
| Error (Choice3Of4 e) -> Error <| Choice4Of5 e
| Error (Choice4Of4 e) -> Error <| Choice5Of5 e
| Error (e) -> Error <| Choice1Of5 e
member inline _.Bind(x: Result<'a,_>,f: 'a -> Result<'d,_>) =
match x with
| Ok x ->
match f x with
| Ok x -> Ok x
| Error (Choice1Of5 e) -> Error <| Choice2Of6 e
| Error (Choice2Of5 e) -> Error <| Choice3Of6 e
| Error (Choice3Of5 e) -> Error <| Choice4Of6 e
| Error (Choice4Of5 e) -> Error <| Choice5Of6 e
| Error (Choice5Of5 e) -> Error <| Choice6Of6 e
| Error (e) -> Error <| Choice1Of6 e
member inline _.Bind(x: Result<'a,_>,f: 'a -> Result<'d,_>) =
match x with
| Ok x ->
match f x with
| Ok x -> Ok x
| Error (Choice1Of6 e) -> Error <| Choice2Of7 e
| Error (Choice2Of6 e) -> Error <| Choice3Of7 e
| Error (Choice3Of6 e) -> Error <| Choice4Of7 e
| Error (Choice4Of6 e) -> Error <| Choice5Of7 e
| Error (Choice5Of6 e) -> Error <| Choice6Of7 e
| Error (Choice6Of6 e) -> Error <| Choice7Of7 e
| Error (e) -> Error <| Choice1Of7 e
type FoodErrors =
| BadFood
| SpilledMilk
let getFood () = result {
let! _ = Error BadFood
return 42
}
type CatErrors =
| CatHungry
| CatHappy
let petCat () = result {
let! _ = Error CatHappy
return 0
}
type WalkAroundErrors =
| SteppedOnLego
| DirtyFloor
let walkAround () = result {
let! _ = Error SteppedOnLego
return 1701
}
type CoffeeErrors =
| HasSugar
| HasCream
let coffee () = result {
let! _ = Error HasSugar
return 1
}
type Error1 =
| ErrorA
| ErrorB
type Error2 =
| ErrorC
| ErrorD
type Error3 =
| ErrorE
| ErrorF
type Error4 =
| ErrorG
| ErrorH
let kitchenActivity () = result {
let! x = getFood ()
printfn "Side effect!"
let! y = petCat ()
let! z = walkAround ()
let! a = coffee ()
let! _ = Error ErrorA
let! _ = Error ErrorB
let! _ = Error ErrorC
let! _ = Error ErrorD
let! _ = Error ErrorE
let! _ = Error ErrorG
let! _ = Error ErrorG
return x + y + z + a
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment