From 38ed09ec4c725d1492efa9d460785ea4e6a149cf Mon Sep 17 00:00:00 2001 From: Victor Freire Date: Tue, 21 Feb 2023 13:56:27 -0300 Subject: [PATCH] Added bind operator for Option Co-Authored-By: Marcos Benevides --- .../FsToolkit.ErrorHandling.fsproj | 1 + src/FsToolkit.ErrorHandling/OptionOp.fs | 11 ++++++++++ tests/FsToolkit.ErrorHandling.Tests/Option.fs | 22 +++++++++++++++++++ 3 files changed, 34 insertions(+) create mode 100644 src/FsToolkit.ErrorHandling/OptionOp.fs diff --git a/src/FsToolkit.ErrorHandling/FsToolkit.ErrorHandling.fsproj b/src/FsToolkit.ErrorHandling/FsToolkit.ErrorHandling.fsproj index 26bc8efd..d16c80cb 100644 --- a/src/FsToolkit.ErrorHandling/FsToolkit.ErrorHandling.fsproj +++ b/src/FsToolkit.ErrorHandling/FsToolkit.ErrorHandling.fsproj @@ -28,6 +28,7 @@ + diff --git a/src/FsToolkit.ErrorHandling/OptionOp.fs b/src/FsToolkit.ErrorHandling/OptionOp.fs new file mode 100644 index 00000000..f6f6583e --- /dev/null +++ b/src/FsToolkit.ErrorHandling/OptionOp.fs @@ -0,0 +1,11 @@ +namespace FsToolkit.ErrorHandling.Operator.Option + +open FsToolkit.ErrorHandling + +[] +module Option = + let inline (>>=) + (input: Option<'input>) + ([] binder: 'input -> Option<'output>) + : Option<'output> = + Option.bind binder input diff --git a/tests/FsToolkit.ErrorHandling.Tests/Option.fs b/tests/FsToolkit.ErrorHandling.Tests/Option.fs index 03efd391..00190319 100644 --- a/tests/FsToolkit.ErrorHandling.Tests/Option.fs +++ b/tests/FsToolkit.ErrorHandling.Tests/Option.fs @@ -10,6 +10,7 @@ open SampleDomain open TestData open TestHelpers open FsToolkit.ErrorHandling +open FsToolkit.ErrorHandling.Operator.Option let traverseResultTests = @@ -172,6 +173,26 @@ let ofPairTests = Expect.equal (Option.ofPair pair) (None) "" ] +let optionOperatorsTests = + testList "Option Operators Tests" [ + testCase "bind operator" + <| fun _ -> + let evenInt x = if x % 2 = 0 then Some x else None + + let tryParseInt (x: string) = + match Int32.TryParse x with + | true, value -> Some value + | _ -> None + + let tryParseEvenInt str = + tryParseInt str + >>= evenInt + + + tryParseEvenInt "2" + |> Expect.hasSomeValue 2 + ] + let allTests = testList "Option Tests" [ traverseResultTests @@ -182,4 +203,5 @@ let allTests = bindNullTests eitherTests ofPairTests + optionOperatorsTests ]