├── .dockerignore
├── .editorconfig
├── .gitattributes
├── .gitignore
├── .markdownlint.json
├── CSharpFunctionalExtensions.Examples
├── CSharpFunctionalExtensions.Examples.csproj
└── ResultExtensions
│ ├── AsyncUsageExamples.cs
│ ├── ExampleFromPluralsightCourse.cs
│ ├── ExampleWithOnFailureMethod.cs
│ ├── Methods
│ └── BindZipExamples.cs
│ ├── PassingResultThroughOnSuccessMethods.cs
│ └── TapExamples.cs
├── CSharpFunctionalExtensions.StrongName
├── CSharpFunctionalExtensions.StrongName.csproj
└── CSharpFunctionalExtensions.snk
├── CSharpFunctionalExtensions.Tests
├── CSharpFunctionalExtensions.Tests.csproj
├── EntityTests
│ ├── BasicTests.cs
│ └── IComparableTests.cs
├── MaybeTests
│ ├── BasicTests.cs
│ ├── BugTests.cs
│ ├── EqualityTests.cs
│ ├── Extensions
│ │ ├── AsMaybeTests.Task.cs
│ │ ├── AsMaybeTests.ValueTask.cs
│ │ ├── AsMaybeTests.cs
│ │ ├── AsNullableTests.cs
│ │ ├── BindOptionalTests.cs
│ │ ├── BindTests.Task.Left.cs
│ │ ├── BindTests.Task.Right.cs
│ │ ├── BindTests.Task.cs
│ │ ├── BindTests.ValueTask.Left.cs
│ │ ├── BindTests.ValueTask.Right.cs
│ │ ├── BindTests.ValueTask.cs
│ │ ├── BindTests.cs
│ │ ├── ChooseTests.cs
│ │ ├── ExecuteNoValueTests.Task.Left.cs
│ │ ├── ExecuteNoValueTests.Task.Right.cs
│ │ ├── ExecuteNoValueTests.Task.cs
│ │ ├── ExecuteNoValueTests.ValueTask.Left.cs
│ │ ├── ExecuteNoValueTests.ValueTask.Right.cs
│ │ ├── ExecuteNoValueTests.ValueTask.cs
│ │ ├── ExecuteNoValueTests.cs
│ │ ├── ExecuteTests.Task.Left.cs
│ │ ├── ExecuteTests.Task.Right.cs
│ │ ├── ExecuteTests.Task.cs
│ │ ├── ExecuteTests.ValueTask.Left.cs
│ │ ├── ExecuteTests.ValueTask.Right.cs
│ │ ├── ExecuteTests.ValueTask.cs
│ │ ├── ExecuteTests.cs
│ │ ├── GetValueOrDefaultTests.cs
│ │ ├── GetValueOrThrowTests.Task.cs
│ │ ├── GetValueOrThrowTests.ValueTask.cs
│ │ ├── GetValueOrThrowTests.cs
│ │ ├── MapTests.Task.Left.cs
│ │ ├── MapTests.Task.Right.cs
│ │ ├── MapTests.Task.cs
│ │ ├── MapTests.ValueTask.Left.cs
│ │ ├── MapTests.ValueTask.Right.cs
│ │ ├── MapTests.ValueTask.cs
│ │ ├── MapTests.cs
│ │ ├── MatchTests.Task.cs
│ │ ├── MatchTests.ValueTask.cs
│ │ ├── MatchTests.cs
│ │ ├── MaybeTestBase.cs
│ │ ├── OptionalTests.cs
│ │ ├── OrTests.Task.Left.cs
│ │ ├── OrTests.Task.Right.cs
│ │ ├── OrTests.Task.cs
│ │ ├── OrTests.ValueTask.Left.cs
│ │ ├── OrTests.ValueTask.Right.cs
│ │ ├── OrTests.ValueTask.cs
│ │ ├── OrTests.cs
│ │ ├── SelectMany.cs
│ │ ├── SelectTests.cs
│ │ ├── ToInvertedResultTests.Task.cs
│ │ ├── ToInvertedResultTests.ValueTask.cs
│ │ ├── ToInvertedResultTests.cs
│ │ ├── ToListTest.cs
│ │ ├── ToResultTests.Task.cs
│ │ ├── ToResultTests.ValueTask.cs
│ │ ├── ToResultTests.cs
│ │ ├── ToUnitResultTests.Task.cs
│ │ ├── ToUnitResultTests.ValueTask.cs
│ │ ├── ToUnitResultTests.cs
│ │ ├── TryFindTests.cs
│ │ ├── TryFirstTest.cs
│ │ ├── TryLastTests.cs
│ │ ├── WhereTests.Task.Left.cs
│ │ ├── WhereTests.Task.Right.cs
│ │ ├── WhereTests.Task.cs
│ │ ├── WhereTests.ValueTask.Left.cs
│ │ ├── WhereTests.ValueTask.Right.cs
│ │ ├── WhereTests.ValueTask.cs
│ │ └── WhereTests.cs
│ └── ImplicitConversionTests.cs
├── NonParallelTestCollectionAttribute.cs
├── ResultTests
│ ├── AmbiguityTests.cs
│ ├── DeconstructionTests.cs
│ ├── Extensions
│ │ ├── AsMaybeTests.cs
│ │ ├── BindIfTests.Base.cs
│ │ ├── BindIfTests.Task.Left.cs
│ │ ├── BindIfTests.Task.Right.cs
│ │ ├── BindIfTests.Task.cs
│ │ ├── BindIfTests.ValueTask.Left.cs
│ │ ├── BindIfTests.ValueTask.Right.cs
│ │ ├── BindIfTests.ValueTask.cs
│ │ ├── BindIfTests.cs
│ │ ├── BindOptionalTests.cs
│ │ ├── BindTests.Base.cs
│ │ ├── BindTests.Task.cs
│ │ ├── BindTests.ValueTask.cs
│ │ ├── BindTests.cs
│ │ ├── BindTryTests.Base.cs
│ │ ├── BindTryTests.Task.Left.cs
│ │ ├── BindTryTests.Task.Right.cs
│ │ ├── BindTryTests.Task.cs
│ │ ├── BindTryTests.ValueTask.Left.cs
│ │ ├── BindTryTests.ValueTask.Right.cs
│ │ ├── BindTryTests.ValueTask.cs
│ │ ├── BindTryTests.cs
│ │ ├── BindZipTests.cs
│ │ ├── BindsTests.Task.Left.cs
│ │ ├── BindsTests.Task.Right.cs
│ │ ├── BindsTests.ValueTask.Left.cs
│ │ ├── BindsTests.ValueTask.Right.cs
│ │ ├── CheckIfTests.Base.cs
│ │ ├── CheckIfTests.Task.Left.cs
│ │ ├── CheckIfTests.Task.Right.cs
│ │ ├── CheckIfTests.Task.cs
│ │ ├── CheckIfTests.ValueTask.Left.cs
│ │ ├── CheckIfTests.ValueTask.Right.cs
│ │ ├── CheckIfTests.ValueTask.cs
│ │ ├── CheckIfTests.cs
│ │ ├── CheckTests.Base.cs
│ │ ├── CheckTests.Task.Left.cs
│ │ ├── CheckTests.Task.Right.cs
│ │ ├── CheckTests.Task.cs
│ │ ├── CheckTests.ValueTask.Left.cs
│ │ ├── CheckTests.ValueTask.Right.cs
│ │ ├── CheckTests.ValueTask.cs
│ │ ├── CheckTests.cs
│ │ ├── CombineInOrderTests.cs
│ │ ├── CompensateTests.Base.cs
│ │ ├── CompensateTests.Task.Left.cs
│ │ ├── CompensateTests.Task.Right.cs
│ │ ├── CompensateTests.Task.cs
│ │ ├── CompensateTests.ValueTask.Left.cs
│ │ ├── CompensateTests.ValueTask.Right.cs
│ │ ├── CompensateTests.ValueTask.cs
│ │ ├── CompensateTests.cs
│ │ ├── EnsureNotNullTests.Base.cs
│ │ ├── EnsureNotNullTests.Task.Left.cs
│ │ ├── EnsureNotNullTests.Task.Right.cs
│ │ ├── EnsureNotNullTests.Task.cs
│ │ ├── EnsureNotNullTests.ValueTask.Left.cs
│ │ ├── EnsureNotNullTests.ValueTask.Right.cs
│ │ ├── EnsureNotNullTests.ValueTask.cs
│ │ ├── EnsureNotNullTests.cs
│ │ ├── EnsureNotTests.cs
│ │ ├── EnsureTests.Task.Left.cs
│ │ ├── EnsureTests.Task.Right.cs
│ │ ├── EnsureTests.Task.cs
│ │ ├── EnsureTests.ValueTask.Left.cs
│ │ ├── EnsureTests.ValueTask.Right.cs
│ │ ├── EnsureTests.ValueTask.cs
│ │ ├── EnsureTests.cs
│ │ ├── FinallyTests.Base.cs
│ │ ├── FinallyTests.Task.Left.cs
│ │ ├── FinallyTests.Task.Right.cs
│ │ ├── FinallyTests.Task.cs
│ │ ├── FinallyTests.ValueTask.Left.cs
│ │ ├── FinallyTests.ValueTask.Right.cs
│ │ ├── FinallyTests.ValueTask.cs
│ │ ├── FinallyTests.cs
│ │ ├── GetValueOrDefaultTests.cs
│ │ ├── MapErrorTests.Task.Left.cs
│ │ ├── MapErrorTests.Task.Right.cs
│ │ ├── MapErrorTests.Task.cs
│ │ ├── MapErrorTests.ValueTask.Left.cs
│ │ ├── MapErrorTests.ValueTask.Right.cs
│ │ ├── MapErrorTests.ValueTask.cs
│ │ ├── MapErrorTests.cs
│ │ ├── MapIfTests.Base.cs
│ │ ├── MapIfTests.Task.Left.cs
│ │ ├── MapIfTests.Task.Right.cs
│ │ ├── MapIfTests.Task.cs
│ │ ├── MapIfTests.ValueTask.Left.cs
│ │ ├── MapIfTests.ValueTask.Right.cs
│ │ ├── MapIfTests.ValueTask.cs
│ │ ├── MapIfTests.cs
│ │ ├── MapTests.Base.cs
│ │ ├── MapTests.Task.Left.cs
│ │ ├── MapTests.Task.Right.cs
│ │ ├── MapTests.Task.cs
│ │ ├── MapTests.ValueTask.Left.cs
│ │ ├── MapTests.ValueTask.Right.cs
│ │ ├── MapTests.ValueTask.cs
│ │ ├── MapTests.cs
│ │ ├── MapTryTests.Base.cs
│ │ ├── MapTryTests.Task.Left.cs
│ │ ├── MapTryTests.Task.Right.cs
│ │ ├── MapTryTests.Task.cs
│ │ ├── MapTryTests.ValueTask.Left.cs
│ │ ├── MapTryTests.ValueTask.Right.cs
│ │ ├── MapTryTests.ValueTask.cs
│ │ ├── MapTryTests.cs
│ │ ├── MatchTests.Base.cs
│ │ ├── MatchTests.Task.Left.cs
│ │ ├── MatchTests.Task.Right.cs
│ │ ├── MatchTests.Task.cs
│ │ ├── MatchTests.ValueTask.Left.cs
│ │ ├── MatchTests.ValueTask.Right.cs
│ │ ├── MatchTests.ValueTask.cs
│ │ ├── MatchTests.cs
│ │ ├── NullableExtensionTests.cs
│ │ ├── OnFailureCompensateTests.Task.Left.cs
│ │ ├── OnFailureCompensateTests.Task.Right.cs
│ │ ├── OnFailureCompensateTests.Task.cs
│ │ ├── OnFailureCompensateTests.ValueTask.Left.cs
│ │ ├── OnFailureCompensateTests.ValueTask.Right.cs
│ │ ├── OnFailureCompensateTests.ValueTask.cs
│ │ ├── OnFailureCompensateTests.cs
│ │ ├── RequiredTests.cs
│ │ ├── SelectTests.cs
│ │ ├── TapErrorIfTests.Base.cs
│ │ ├── TapErrorIfTests.Task.Left.cs
│ │ ├── TapErrorIfTests.Task.Right.cs
│ │ ├── TapErrorIfTests.Task.cs
│ │ ├── TapErrorIfTests.ValueTask.Left.cs
│ │ ├── TapErrorIfTests.ValueTask.Right.cs
│ │ ├── TapErrorIfTests.ValueTask.cs
│ │ ├── TapErrorIfTests.cs
│ │ ├── TapErrorTests.Base.cs
│ │ ├── TapErrorTests.Task.Left.cs
│ │ ├── TapErrorTests.Task.Right.cs
│ │ ├── TapErrorTests.Task.cs
│ │ ├── TapErrorTests.ValueTask.Left.cs
│ │ ├── TapErrorTests.ValueTask.Right.cs
│ │ ├── TapErrorTests.ValueTask.cs
│ │ ├── TapErrorTests.cs
│ │ ├── TapIfTests.Base.cs
│ │ ├── TapIfTests.Task.Left.cs
│ │ ├── TapIfTests.Task.Right.cs
│ │ ├── TapIfTests.Task.cs
│ │ ├── TapIfTests.Value.Task.Left.cs
│ │ ├── TapIfTests.Value.Task.Right.cs
│ │ ├── TapIfTests.Value.Task.cs
│ │ ├── TapIfTests.cs
│ │ ├── TapTests.Base.cs
│ │ ├── TapTests.Task.Left.cs
│ │ ├── TapTests.Task.Right.cs
│ │ ├── TapTests.Task.cs
│ │ ├── TapTests.ValueTask.Left.cs
│ │ ├── TapTests.ValueTask.Right.cs
│ │ ├── TapTests.ValueTask.cs
│ │ ├── TapTests.cs
│ │ └── TapTryTests.cs
│ ├── ImplicitConversionTests.cs
│ ├── Json
│ │ └── Serialization
│ │ │ ├── HttpResponseMessageJsonExtensionsTests.cs
│ │ │ └── SerializationTests.cs
│ ├── Methods
│ │ ├── CombineTests.cs
│ │ ├── CombineWithErrorTests.cs
│ │ ├── ConvertFailureTests.cs
│ │ ├── FailedResultTests.cs
│ │ ├── FirstFailureOrSuccessTests.cs
│ │ ├── OfTests.cs
│ │ ├── SucceededResultTests.cs
│ │ ├── SuccessIfTests.cs
│ │ ├── TryGetTests.cs
│ │ ├── TryTaskTest.Base.cs
│ │ ├── TryTest.Base.Common.cs
│ │ ├── TryTest.Base.cs
│ │ ├── TryTests.Task.cs
│ │ ├── TryTests.cs
│ │ └── TryValueTaskTest.Base.cs
│ ├── ResultTests.cs
│ ├── SerializationTests.cs
│ ├── TestBase.cs
│ └── ToStringTests.cs
├── TaskExtensions.cs
├── ValueObjectTests
│ ├── AnotherTestEnumValueObject.cs
│ ├── BasicTests.cs
│ ├── EnumValueObjectTests.cs
│ ├── IComparableTests.cs
│ └── TestEnumValueObject.cs
└── ValueTaskExtensions.cs
├── CSharpFunctionalExtensions.sln
├── CSharpFunctionalExtensions
├── CSharpFunctionalExtensions.csproj
├── Entity
│ └── Entity.cs
├── ICombine.cs
├── Maybe
│ ├── Extensions
│ │ ├── AsMaybe.Task.cs
│ │ ├── AsMaybe.ValueTask.cs
│ │ ├── AsMaybe.cs
│ │ ├── AsNullable.cs
│ │ ├── Bind.Task.Left.cs
│ │ ├── Bind.Task.Right.cs
│ │ ├── Bind.Task.cs
│ │ ├── Bind.ValueTask.Left.cs
│ │ ├── Bind.ValueTask.Right.cs
│ │ ├── Bind.ValueTask.cs
│ │ ├── Bind.cs
│ │ ├── BindOptional.cs
│ │ ├── Choose.cs
│ │ ├── Deconstruct.cs
│ │ ├── Execute.Task.Left.cs
│ │ ├── Execute.Task.Right.cs
│ │ ├── Execute.Task.cs
│ │ ├── Execute.ValueTask.Left.cs
│ │ ├── Execute.ValueTask.Right.cs
│ │ ├── Execute.ValueTask.cs
│ │ ├── Execute.cs
│ │ ├── ExecuteNoValue.Task.Left.cs
│ │ ├── ExecuteNoValue.Task.Right.cs
│ │ ├── ExecuteNoValue.Task.cs
│ │ ├── ExecuteNoValue.ValueTask.Left.cs
│ │ ├── ExecuteNoValue.ValueTask.Right.cs
│ │ ├── ExecuteNoValue.ValueTask.cs
│ │ ├── ExecuteNoValue.cs
│ │ ├── Flatten.cs
│ │ ├── GetValueOrDefault.Task.Left.cs
│ │ ├── GetValueOrDefault.Task.Right.cs
│ │ ├── GetValueOrDefault.Task.cs
│ │ ├── GetValueOrDefault.ValueTask.Left.cs
│ │ ├── GetValueOrDefault.ValueTask.Right.cs
│ │ ├── GetValueOrDefault.ValueTask.cs
│ │ ├── GetValueOrDefault.cs
│ │ ├── GetValueOrThrow.Task.cs
│ │ ├── GetValueOrThrow.ValueTask.cs
│ │ ├── Map.Task.Left.cs
│ │ ├── Map.Task.Right.cs
│ │ ├── Map.Task.cs
│ │ ├── Map.ValueTask.Left.cs
│ │ ├── Map.ValueTask.Right.cs
│ │ ├── Map.ValueTask.cs
│ │ ├── Map.cs
│ │ ├── Match.Task.cs
│ │ ├── Match.ValueTask.cs
│ │ ├── Match.cs
│ │ ├── Optional.cs
│ │ ├── Or.Task.Left.cs
│ │ ├── Or.Task.Right.cs
│ │ ├── Or.Task.cs
│ │ ├── Or.ValueTask.Left.cs
│ │ ├── Or.ValueTask.Right.cs
│ │ ├── Or.ValueTask.cs
│ │ ├── Or.cs
│ │ ├── Select.cs
│ │ ├── SelectMany.cs
│ │ ├── ToInvertedResult.Task.cs
│ │ ├── ToInvertedResult.ValueTask.cs
│ │ ├── ToInvertedResult.cs
│ │ ├── ToList.cs
│ │ ├── ToResult.Task.cs
│ │ ├── ToResult.ValueTask.cs
│ │ ├── ToResult.cs
│ │ ├── ToUnitResult.Task.cs
│ │ ├── ToUnitResult.ValueTask.cs
│ │ ├── ToUnitResult.cs
│ │ ├── TryFind.cs
│ │ ├── TryFirst.cs
│ │ ├── TryLast.cs
│ │ ├── Where.Task.Left.cs
│ │ ├── Where.Task.Right.cs
│ │ ├── Where.Task.cs
│ │ ├── Where.ValueTask.Left.cs
│ │ ├── Where.ValueTask.Right.cs
│ │ ├── Where.ValueTask.cs
│ │ └── Where.cs
│ ├── Maybe.Configuration.cs
│ ├── Maybe.cs
│ └── MaybeEqualityComparer.cs
├── Result
│ ├── Exceptions
│ │ ├── ResultFailureException.cs
│ │ └── ResultSuccessException.cs
│ ├── IResult.cs
│ ├── Internal
│ │ ├── Result.Messages.cs
│ │ ├── ResultCommonLogic.cs
│ │ ├── SerializationValue.cs
│ │ ├── TaskExtensions.cs
│ │ └── ValueTaskExtensions.cs
│ ├── Json
│ │ └── Serialization
│ │ │ ├── CSharpFunctionalExtensionsJsonSerializerOptions.cs
│ │ │ ├── DtoMessages.cs
│ │ │ ├── HttpResponseMessageJsonExtensions.cs
│ │ │ ├── JsonSerializerOptionsExtensionMethods.cs
│ │ │ ├── ResultDto.cs
│ │ │ ├── ResultJsonConverter.cs
│ │ │ ├── ResultJsonOfTConverter.cs
│ │ │ ├── ResultOfTEJsonConverterFactory.cs
│ │ │ ├── UnitResultDto.cs
│ │ │ └── UnitResultJsonConverterFactoryOfT.cs
│ ├── Methods
│ │ ├── Combine.cs
│ │ ├── ConvertFailure.cs
│ │ ├── Extensions
│ │ │ ├── AsMaybe.cs
│ │ │ ├── Bind.Task.Left.cs
│ │ │ ├── Bind.Task.Right.cs
│ │ │ ├── Bind.Task.cs
│ │ │ ├── Bind.ValueTask.Left.cs
│ │ │ ├── Bind.ValueTask.Right.cs
│ │ │ ├── Bind.ValueTask.cs
│ │ │ ├── Bind.cs
│ │ │ ├── BindIf.Task.Left.cs
│ │ │ ├── BindIf.Task.Right.cs
│ │ │ ├── BindIf.Task.cs
│ │ │ ├── BindIf.ValueTask.Left.cs
│ │ │ ├── BindIf.ValueTask.Right.cs
│ │ │ ├── BindIf.ValueTask.cs
│ │ │ ├── BindIf.cs
│ │ │ ├── BindOptional.cs
│ │ │ ├── BindTry.Task.Left.cs
│ │ │ ├── BindTry.Task.Right.cs
│ │ │ ├── BindTry.Task.cs
│ │ │ ├── BindTry.ValueTask.Left.cs
│ │ │ ├── BindTry.ValueTask.Right.cs
│ │ │ ├── BindTry.ValueTask.cs
│ │ │ ├── BindTry.cs
│ │ │ ├── BindWithTransactionScope.Task.Left.cs
│ │ │ ├── BindWithTransactionScope.Task.Right.cs
│ │ │ ├── BindWithTransactionScope.Task.cs
│ │ │ ├── BindWithTransactionScope.ValueTask.Left.cs
│ │ │ ├── BindWithTransactionScope.ValueTask.Right.cs
│ │ │ ├── BindWithTransactionScope.ValueTask.cs
│ │ │ ├── BindWithTransactionScope.cs
│ │ │ ├── BindZip.Task.Left.cs
│ │ │ ├── BindZip.Task.Right.cs
│ │ │ ├── BindZip.Task.cs
│ │ │ ├── BindZip.cs
│ │ │ ├── Check.Task.Left.cs
│ │ │ ├── Check.Task.Right.cs
│ │ │ ├── Check.Task.cs
│ │ │ ├── Check.ValueTask.Left.cs
│ │ │ ├── Check.ValueTask.Right.cs
│ │ │ ├── Check.ValueTask.cs
│ │ │ ├── Check.cs
│ │ │ ├── CheckIf.Task.Left.cs
│ │ │ ├── CheckIf.Task.Right.cs
│ │ │ ├── CheckIf.Task.cs
│ │ │ ├── CheckIf.ValueTask.Left.cs
│ │ │ ├── CheckIf.ValueTask.Right.cs
│ │ │ ├── CheckIf.ValueTask.cs
│ │ │ ├── CheckIf.cs
│ │ │ ├── Combine.Task.cs
│ │ │ ├── Combine.ValueTask.cs
│ │ │ ├── Combine.cs
│ │ │ ├── CombineInOrder.Task.cs
│ │ │ ├── CombineInOrder.ValueTask.cs
│ │ │ ├── Compensate.Task.Left.cs
│ │ │ ├── Compensate.Task.Right.cs
│ │ │ ├── Compensate.Task.cs
│ │ │ ├── Compensate.ValueTask.Left.cs
│ │ │ ├── Compensate.ValueTask.Right.cs
│ │ │ ├── Compensate.ValueTask.cs
│ │ │ ├── Compensate.cs
│ │ │ ├── Deconstruct.cs
│ │ │ ├── Ensure.Task.Left.cs
│ │ │ ├── Ensure.Task.Right.cs
│ │ │ ├── Ensure.Task.cs
│ │ │ ├── Ensure.ValueTask.Left.cs
│ │ │ ├── Ensure.ValueTask.Right.cs
│ │ │ ├── Ensure.ValueTask.cs
│ │ │ ├── Ensure.cs
│ │ │ ├── EnsureNot.cs
│ │ │ ├── EnsureNotNull.Task.Left.cs
│ │ │ ├── EnsureNotNull.Task.Right.cs
│ │ │ ├── EnsureNotNull.Task.cs
│ │ │ ├── EnsureNotNull.ValueTask.Left.cs
│ │ │ ├── EnsureNotNull.ValueTask.Right.cs
│ │ │ ├── EnsureNotNull.ValueTask.cs
│ │ │ ├── EnsureNotNull.cs
│ │ │ ├── Finally.Task.Left.cs
│ │ │ ├── Finally.Task.Right.cs
│ │ │ ├── Finally.Task.cs
│ │ │ ├── Finally.ValueTask.Left.cs
│ │ │ ├── Finally.ValueTask.Right.cs
│ │ │ ├── Finally.ValueTask.cs
│ │ │ ├── Finally.cs
│ │ │ ├── GetValueOrDefault.Task.Left.cs
│ │ │ ├── GetValueOrDefault.Task.Right.cs
│ │ │ ├── GetValueOrDefault.Task.cs
│ │ │ ├── GetValueOrDefault.ValueTask.Left.cs
│ │ │ ├── GetValueOrDefault.ValueTask.Right.cs
│ │ │ ├── GetValueOrDefault.ValueTask.cs
│ │ │ ├── GetValueOrDefault.cs
│ │ │ ├── Map.Task.Left.cs
│ │ │ ├── Map.Task.Right.cs
│ │ │ ├── Map.Task.cs
│ │ │ ├── Map.ValueTask.Left.cs
│ │ │ ├── Map.ValueTask.Right.cs
│ │ │ ├── Map.ValueTask.cs
│ │ │ ├── Map.cs
│ │ │ ├── MapError.Task.Left.cs
│ │ │ ├── MapError.Task.Right.cs
│ │ │ ├── MapError.Task.cs
│ │ │ ├── MapError.ValueTask.Left.cs
│ │ │ ├── MapError.ValueTask.Right.cs
│ │ │ ├── MapError.ValueTask.cs
│ │ │ ├── MapError.cs
│ │ │ ├── MapIf.Task.Left.cs
│ │ │ ├── MapIf.Task.Right.cs
│ │ │ ├── MapIf.Task.cs
│ │ │ ├── MapIf.ValueTask.Left.cs
│ │ │ ├── MapIf.ValueTask.Right.cs
│ │ │ ├── MapIf.ValueTask.cs
│ │ │ ├── MapIf.cs
│ │ │ ├── MapTry.Task.Left.cs
│ │ │ ├── MapTry.Task.Right.cs
│ │ │ ├── MapTry.Task.cs
│ │ │ ├── MapTry.ValueTask.Left.cs
│ │ │ ├── MapTry.ValueTask.Right.cs
│ │ │ ├── MapTry.ValueTask.cs
│ │ │ ├── MapTry.cs
│ │ │ ├── MapWithTransactionScope.Task.Left.cs
│ │ │ ├── MapWithTransactionScope.Task.Right.cs
│ │ │ ├── MapWithTransactionScope.Task.cs
│ │ │ ├── MapWithTransactionScope.ValueTask.Left.cs
│ │ │ ├── MapWithTransactionScope.ValueTask.Right.cs
│ │ │ ├── MapWithTransactionScope.ValueTask.cs
│ │ │ ├── MapWithTransactionScope.cs
│ │ │ ├── Match.Task.Left.cs
│ │ │ ├── Match.Task.Right.cs
│ │ │ ├── Match.Task.cs
│ │ │ ├── Match.ValueTask.Left.cs
│ │ │ ├── Match.ValueTask.Right.cs
│ │ │ ├── Match.ValueTask.cs
│ │ │ ├── Match.cs
│ │ │ ├── OnFailureCompensate.Task.Left.cs
│ │ │ ├── OnFailureCompensate.Task.Right.cs
│ │ │ ├── OnFailureCompensate.Task.cs
│ │ │ ├── OnFailureCompensate.ValueTask.Left.cs
│ │ │ ├── OnFailureCompensate.ValueTask.Right.cs
│ │ │ ├── OnFailureCompensate.ValueTask.cs
│ │ │ ├── OnFailureCompensate.cs
│ │ │ ├── OnSuccessTry.Task.Left.cs
│ │ │ ├── OnSuccessTry.Task.Right.cs
│ │ │ ├── OnSuccessTry.Task.cs
│ │ │ ├── OnSuccessTry.cs
│ │ │ ├── Required.cs
│ │ │ ├── Select.cs
│ │ │ ├── SelectMany.Task.Left.cs
│ │ │ ├── SelectMany.Task.Right.cs
│ │ │ ├── SelectMany.Task.cs
│ │ │ ├── SelectMany.ValueTask.Left.cs
│ │ │ ├── SelectMany.ValueTask.Right.cs
│ │ │ ├── SelectMany.ValueTask.cs
│ │ │ ├── SelectMany.cs
│ │ │ ├── Tap.Task.Left.cs
│ │ │ ├── Tap.Task.Right.cs
│ │ │ ├── Tap.Task.cs
│ │ │ ├── Tap.ValueTask.Left.cs
│ │ │ ├── Tap.ValueTask.Right.cs
│ │ │ ├── Tap.ValueTask.cs
│ │ │ ├── Tap.cs
│ │ │ ├── TapError.Task.Left.cs
│ │ │ ├── TapError.Task.Right.cs
│ │ │ ├── TapError.Task.cs
│ │ │ ├── TapError.ValueTask.Left.cs
│ │ │ ├── TapError.ValueTask.Right.cs
│ │ │ ├── TapError.ValueTask.cs
│ │ │ ├── TapError.cs
│ │ │ ├── TapErrorIf.Task.Left.cs
│ │ │ ├── TapErrorIf.Task.Right.cs
│ │ │ ├── TapErrorIf.Task.cs
│ │ │ ├── TapErrorIf.ValueTask.Left.cs
│ │ │ ├── TapErrorIf.ValueTask.Right.cs
│ │ │ ├── TapErrorIf.ValueTask.cs
│ │ │ ├── TapErrorIf.cs
│ │ │ ├── TapIf.Task.Left.cs
│ │ │ ├── TapIf.Task.Right.cs
│ │ │ ├── TapIf.Task.cs
│ │ │ ├── TapIf.ValueTask.Left.cs
│ │ │ ├── TapIf.ValueTask.Right.cs
│ │ │ ├── TapIf.ValueTask.cs
│ │ │ ├── TapIf.cs
│ │ │ ├── TapIfTry.Task.Left.cs
│ │ │ ├── TapIfTry.Task.Right.cs
│ │ │ ├── TapIfTry.Task.cs
│ │ │ ├── TapIfTry.cs
│ │ │ ├── TapTry.Task.Left.cs
│ │ │ ├── TapTry.Task.Right.cs
│ │ │ ├── TapTry.Task.cs
│ │ │ ├── TapTry.cs
│ │ │ └── WithTransactionScope.cs
│ │ ├── Failure.cs
│ │ ├── FailureIf.Task.cs
│ │ ├── FailureIf.ValueTask.cs
│ │ ├── FailureIf.cs
│ │ ├── FirstFailureOrSuccess.cs
│ │ ├── Of.cs
│ │ ├── Success.cs
│ │ ├── SuccessIf.Task.cs
│ │ ├── SuccessIf.ValueTask.cs
│ │ ├── SuccessIf.cs
│ │ ├── ToString.cs
│ │ ├── Try.Task.cs
│ │ ├── Try.cs
│ │ └── TryGet.cs
│ ├── NullableExtensions.cs
│ ├── Result.Configuration.cs
│ ├── Result.cs
│ ├── ResultT.cs
│ ├── ResultTE.cs
│ └── UnitResult.cs
└── ValueObject
│ ├── ComparableValueObject.cs
│ ├── EnumValueObject.cs
│ ├── SimpleValueObject.cs
│ ├── ValueObject.cs
│ └── ValueObjectOfT.cs
├── Common.Build.props
├── Dockerfile
├── LICENSE
├── README.md
├── azure-pipelines.yml
└── version.txt
/.dockerignore:
--------------------------------------------------------------------------------
1 | **/.git/
2 | **/.vs/
3 | **/bin/
4 | **/obj/
5 | **/*ncrunch*
6 | **/out/
7 | **/TestResults/
8 |
9 | Dockerfile*
10 | nCrunchTemp*
11 |
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Auto detect text files and perform LF normalization
2 | * text=auto
3 |
4 | # Custom for Visual Studio
5 | *.cs diff=csharp
6 |
7 | # Standard to msysgit
8 | *.doc diff=astextplain
9 | *.DOC diff=astextplain
10 | *.docx diff=astextplain
11 | *.DOCX diff=astextplain
12 | *.dot diff=astextplain
13 | *.DOT diff=astextplain
14 | *.pdf diff=astextplain
15 | *.PDF diff=astextplain
16 | *.rtf diff=astextplain
17 | *.RTF diff=astextplain
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | out
2 | .svn
3 | obj
4 | bin
5 | .idea
6 | _ReSharper*
7 | *.sln.GhostDoc.xml
8 | *.dotCover
9 | *.suo
10 | *.user
11 | *.Cache
12 | *.cache
13 | *.ncrunchsolution
14 | *.ncrunchproject
15 | /packages/*/*
16 | /Tools/*/*
17 | project.lock.json
18 | project.fragment.lock.json
19 | .vs
20 | /CSharpFunctionalExtensions/CSharpFunctionalExtensions.xml
21 | *ncrunch*
22 |
--------------------------------------------------------------------------------
/.markdownlint.json:
--------------------------------------------------------------------------------
1 | {
2 | "line-length": {
3 | "line_length": 140
4 | },
5 | "code-block-style": {
6 | "style": "fenced"
7 | },
8 | "code": true,
9 | "code-fence-style": true,
10 | "no-duplicate-header": {
11 | "siblings_only": true
12 | }
13 | }
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Examples/CSharpFunctionalExtensions.Examples.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | netstandard2.0
5 | 8.0
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Examples/ResultExtensions/ExampleFromPluralsightCourse.cs:
--------------------------------------------------------------------------------
1 | namespace CSharpFunctionalExtensions.Examples.ResultExtensions
2 | {
3 | public class ExampleFromPluralsightCourse
4 | {
5 | public string Promote(long id)
6 | {
7 | var gateway = new EmailGateway();
8 |
9 | return GetById(id)
10 | .ToResult("Customer with such Id is not found: " + id)
11 | .Ensure(customer => customer.CanBePromoted(), "The customer has the highest status possible")
12 | .Tap(customer => customer.Promote())
13 | .Bind(customer => gateway.SendPromotionNotification(customer.Email))
14 | .Finally(result => result.IsSuccess ? "Ok" : result.Error);
15 | }
16 |
17 | public Maybe GetById(long id)
18 | {
19 | return new Customer();
20 | }
21 |
22 | public class Customer
23 | {
24 | public string Email { get; }
25 |
26 | public Customer()
27 | {
28 | }
29 |
30 | public bool CanBePromoted()
31 | {
32 | return true;
33 | }
34 |
35 | public void Promote()
36 | {
37 | }
38 | }
39 |
40 | public class EmailGateway
41 | {
42 | public Result SendPromotionNotification(string email)
43 | {
44 | return Result.Success();
45 | }
46 | }
47 | }
48 | }
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Examples/ResultExtensions/Methods/BindZipExamples.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 |
3 | namespace CSharpFunctionalExtensions.Examples.ResultExtensions.Methods
4 | {
5 | public class BindZipExamples
6 | {
7 | public async Task BindZipAsyncSample()
8 | {
9 | await FetchFirstEntity()
10 | .BindZip(FetchSecondEntity)
11 | .Map(x => $"{x.First}, {x.Second}!");
12 |
13 | return;
14 |
15 | Task> FetchFirstEntity() =>
16 | Task.FromResult(Result.Success("Hello"));
17 |
18 | Result FetchSecondEntity(string _) =>
19 | "World";
20 | }
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Examples/ResultExtensions/PassingResultThroughOnSuccessMethods.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 |
4 | namespace CSharpFunctionalExtensions.Examples.ResultExtensions
5 | {
6 | public class PassingResultThroughOnSuccessMethods
7 | {
8 | public void Example1()
9 | {
10 | Result result = FunctionInt()
11 | .Bind(x => FunctionString(x))
12 | .Bind(x => FunctionDateTime(x));
13 | }
14 |
15 | public void Example2()
16 | {
17 | Result result = FunctionInt()
18 | .Bind(_ => FunctionString())
19 | .Bind(x => FunctionDateTime(x));
20 | }
21 |
22 | private Result FunctionInt()
23 | {
24 | return Result.Success(1);
25 | }
26 |
27 | private Result FunctionString(int intValue)
28 | {
29 | return Result.Success("Ok");
30 | }
31 |
32 | private Result FunctionString()
33 | {
34 | return Result.Success("Ok");
35 | }
36 |
37 | private Result FunctionDateTime(string stringValue)
38 | {
39 | return Result.Success(DateTime.Now);
40 | }
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.StrongName/CSharpFunctionalExtensions.snk:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vkhorikov/CSharpFunctionalExtensions/15a6158ce2b3e8d67315696e9d2d0693014ec906/CSharpFunctionalExtensions.StrongName/CSharpFunctionalExtensions.snk
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/AsMaybeTests.Task.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 | using CSharpFunctionalExtensions.Tests.ResultTests;
3 | using FluentAssertions;
4 | using Xunit;
5 |
6 | namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions;
7 |
8 | public class AsMaybeTests_Task : TestBase
9 | {
10 | [Fact]
11 | public async Task AsMaybe_Task_Struct_maybe_conversion_equality_none()
12 | {
13 | double? none = default;
14 | var maybeNone = await none.AsTask().AsMaybe();
15 | maybeNone.HasValue.Should().Be(none.HasValue);
16 | }
17 |
18 | [Fact]
19 | public async Task AsMaybe_Task_Struct_maybe_conversion_equality_some()
20 | {
21 | double? some = 123;
22 | var someMaybe = await some.AsTask().AsMaybe();
23 | someMaybe.HasValue.Should().Be(some.HasValue);
24 | someMaybe.Value.Should().Be(some);
25 | }
26 |
27 | [Fact]
28 | public async Task AsMaybe_Task_Class_maybe_conversion_none()
29 | {
30 | var maybeT = await Maybe.None.AsTask();
31 | maybeT.HasValue.Should().BeFalse();
32 | }
33 |
34 | [Fact]
35 | public async Task AsMaybe_Task_Class_maybe_conversion_some()
36 | {
37 | var maybeT = await T.Value.AsMaybe().AsTask();
38 | maybeT.HasValue.Should().BeTrue();
39 | maybeT.Value.Should().Be(T.Value);
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/AsMaybeTests.ValueTask.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 | using CSharpFunctionalExtensions.Tests.ResultTests;
3 | using CSharpFunctionalExtensions.ValueTasks;
4 | using FluentAssertions;
5 | using Xunit;
6 |
7 | namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions;
8 |
9 | public class AsMaybeTests_ValueTask : TestBase
10 | {
11 | [Fact]
12 | public async Task AsMaybe_ValueTask_Struct_maybe_conversion_equality_none()
13 | {
14 | double? none = default;
15 | var maybeNone = await none.AsValueTask().AsMaybe();
16 | maybeNone.HasValue.Should().Be(none.HasValue);
17 | }
18 |
19 | [Fact]
20 | public async Task AsMaybe_ValueTask_Struct_maybe_conversion_equality_some()
21 | {
22 | double? some = 123;
23 | var someMaybe = await some.AsValueTask().AsMaybe();
24 | someMaybe.HasValue.Should().Be(some.HasValue);
25 | someMaybe.Value.Should().Be(some);
26 | }
27 |
28 | [Fact]
29 | public async Task AsMaybe_ValueTask_Class_maybe_conversion_none()
30 | {
31 | var maybeT = await Maybe.None.AsValueTask();
32 | maybeT.HasValue.Should().BeFalse();
33 | }
34 |
35 | [Fact]
36 | public async Task AsMaybe_ValueTask_Class_maybe_conversion_some()
37 | {
38 | var maybeT = await T.Value.AsValueTask().AsMaybe();
39 | maybeT.HasValue.Should().BeTrue();
40 | maybeT.Value.Should().Be(T.Value);
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/AsMaybeTests.cs:
--------------------------------------------------------------------------------
1 | using CSharpFunctionalExtensions.Tests.ResultTests;
2 | using FluentAssertions;
3 | using Xunit;
4 |
5 | namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions;
6 |
7 | public class AsMaybeTests : TestBase
8 | {
9 | [Fact]
10 | public void AsMaybe_Struct_maybe_conversion_equality_none()
11 | {
12 | double? none = default;
13 | Maybe maybeNone = none.AsMaybe();
14 | maybeNone.HasValue.Should().Be(none.HasValue);
15 | }
16 |
17 | [Fact]
18 | public void AsMaybe_Struct_maybe_conversion_equality_some()
19 | {
20 | double? some = 123;
21 | Maybe someMaybe = some.AsMaybe();
22 | someMaybe.HasValue.Should().Be(some.HasValue);
23 | someMaybe.Value.Should().Be(some);
24 | }
25 |
26 | [Fact]
27 | public void AsMaybe_Class_maybe_conversion_none()
28 | {
29 | Maybe maybeT = null;
30 | maybeT.HasValue.Should().BeFalse();
31 | }
32 |
33 | [Fact]
34 | public void AsMaybe_Class_maybe_conversion_some()
35 | {
36 | Maybe maybeT = T.Value.AsMaybe();
37 | maybeT.HasValue.Should().BeTrue();
38 | maybeT.Value.Should().Be(T.Value);
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/AsNullableTests.cs:
--------------------------------------------------------------------------------
1 | using FluentAssertions;
2 | using Xunit;
3 |
4 | namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions;
5 |
6 | public class AsNullableTests
7 | {
8 | [Fact]
9 | public void Struct_nullable_conversion_equality_none()
10 | {
11 | Maybe none = default;
12 | double? noneNullable = none.AsNullable();
13 | noneNullable.HasValue.Should().Be(none.HasValue);
14 | }
15 |
16 | [Fact]
17 | public void Struct_nullable_conversion_equality_some()
18 | {
19 | Maybe some = 123;
20 | double? someNullable = some.AsNullable();
21 | someNullable.HasValue.Should().Be(some.HasValue);
22 | someNullable.Should().Be(some.Value);
23 | }
24 | }
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/ChooseTests.cs:
--------------------------------------------------------------------------------
1 | using FluentAssertions;
2 | using Xunit;
3 |
4 | namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions;
5 |
6 | public class ChooseTests
7 | {
8 | [Fact]
9 | public void Choose_double_values()
10 | {
11 | var source = new[]
12 | {
13 | Maybe.None,
14 | 1,
15 | Maybe.None,
16 | 2,
17 | 3
18 | };
19 |
20 | var doubled = source.Choose(x => x * 2);
21 |
22 | var expected = new[] { 2, 4, 6 };
23 | doubled.Should().BeEquivalentTo(expected);
24 | }
25 |
26 | [Fact]
27 | public void Choose_values()
28 | {
29 | var source = new[]
30 | {
31 | Maybe.None,
32 | 1,
33 | Maybe.None,
34 | 2,
35 | 3
36 | };
37 |
38 | var values = source.Choose();
39 |
40 | var expected = new[] { 1, 2, 3 };
41 | values.Should().BeEquivalentTo(expected);
42 | }
43 | }
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/ExecuteNoValueTests.Task.Left.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 | using FluentAssertions;
3 | using Xunit;
4 |
5 | namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions
6 | {
7 | public class ExecuteNoValueTests_Task_Left : MaybeTestBase
8 | {
9 | [Fact]
10 | public async Task ExecuteNoValue_Task_Left_executes_action_when_no_value()
11 | {
12 | string property = null;
13 |
14 | Maybe maybe = null;
15 |
16 | await maybe.AsTask().ExecuteNoValue(() => property = "Some value");
17 |
18 | property.Should().Be("Some value");
19 | }
20 | }
21 | }
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/ExecuteNoValueTests.Task.Right.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 | using FluentAssertions;
3 | using Xunit;
4 |
5 | namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions
6 | {
7 | public class ExecuteNoValueTests_Task_Right : MaybeTestBase
8 | {
9 | [Fact]
10 | public async Task ExecuteNoValue_Task_Right_executes_action_when_no_value()
11 | {
12 | string property = null;
13 |
14 | Maybe maybe = null;
15 |
16 | await maybe.ExecuteNoValue(() =>
17 | {
18 | property = "Some value";
19 | return Task.CompletedTask;
20 | });
21 |
22 | property.Should().Be("Some value");
23 | }
24 | }
25 | }
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/ExecuteNoValueTests.Task.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 | using FluentAssertions;
3 | using Xunit;
4 |
5 | namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions
6 | {
7 | public class ExecuteNoValueTests_Task : MaybeTestBase
8 | {
9 | [Fact]
10 | public async Task ExecuteNoValue_Task_executes_action_when_no_value()
11 | {
12 | string property = null;
13 |
14 | Maybe maybe = null;
15 |
16 | await maybe.AsTask().ExecuteNoValue(() =>
17 | {
18 | property = "Some value";
19 | return Task.CompletedTask;
20 | });
21 |
22 | property.Should().Be("Some value");
23 | }
24 | }
25 | }
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/ExecuteNoValueTests.ValueTask.Left.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 | using CSharpFunctionalExtensions.ValueTasks;
3 | using FluentAssertions;
4 | using Xunit;
5 |
6 | namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions
7 | {
8 | public class ExecuteNoValueTests_ValueTask_Left : MaybeTestBase
9 | {
10 | [Fact]
11 | public async Task ExecuteNoValue_ValueTask_Left_executes_action_when_no_value()
12 | {
13 | string property = null;
14 |
15 | Maybe maybe = null;
16 |
17 | await maybe.AsValueTask().ExecuteNoValue(() => property = "Some value");
18 |
19 | property.Should().Be("Some value");
20 | }
21 | }
22 | }
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/ExecuteNoValueTests.ValueTask.Right.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 | using CSharpFunctionalExtensions.ValueTasks;
3 | using FluentAssertions;
4 | using Xunit;
5 |
6 | namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions
7 | {
8 | public class ExecuteNoValueTests_ValueTask_Right : MaybeTestBase
9 | {
10 | [Fact]
11 | public async Task ExecuteNoValue_ValueTask_Right_executes_action_when_no_value()
12 | {
13 | string property = null;
14 |
15 | Maybe maybe = null;
16 |
17 | await maybe.ExecuteNoValue(() =>
18 | {
19 | property = "Some value";
20 | return ValueTask.CompletedTask;
21 | });
22 |
23 | property.Should().Be("Some value");
24 | }
25 | }
26 | }
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/ExecuteNoValueTests.ValueTask.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 | using CSharpFunctionalExtensions.ValueTasks;
3 | using FluentAssertions;
4 | using Xunit;
5 |
6 | namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions
7 | {
8 | public class ExecuteNoValueTests_ValueTask : MaybeTestBase
9 | {
10 | [Fact]
11 | public async Task ExecuteNoValue_ValueTask_executes_action_when_no_value()
12 | {
13 | string property = null;
14 |
15 | Maybe maybe = null;
16 |
17 | await maybe.AsValueTask().ExecuteNoValue(() =>
18 | {
19 | property = "Some value";
20 | return ValueTask.CompletedTask;
21 | });
22 |
23 | property.Should().Be("Some value");
24 | }
25 | }
26 | }
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/ExecuteNoValueTests.cs:
--------------------------------------------------------------------------------
1 | using FluentAssertions;
2 | using Xunit;
3 |
4 | namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions
5 | {
6 | public class ExecuteNoValueTests : MaybeTestBase
7 | {
8 | [Fact]
9 | public void ExecuteNoValue_executes_action_when_no_value()
10 | {
11 | string property = null;
12 |
13 | Maybe maybe = null;
14 |
15 | maybe.ExecuteNoValue(() => property = "Some value");
16 |
17 | property.Should().Be("Some value");
18 | }
19 | }
20 | }
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/ExecuteTests.Task.Left.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 | using FluentAssertions;
3 | using Xunit;
4 |
5 | namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions
6 | {
7 | public class ExecuteTests_Task_Left : MaybeTestBase
8 | {
9 | [Fact]
10 | public async Task Execute_Task_Lef_does_not_execute_action_if_no_value()
11 | {
12 | Maybe instance = null;
13 |
14 | await instance.AsTask().Execute(value => instance = T.Value);
15 |
16 | instance.HasNoValue.Should().BeTrue();
17 | }
18 |
19 | [Fact]
20 | public async Task Execute_Task_Lef_executes_action_if_value()
21 | {
22 | Maybe instance = T.Value;
23 |
24 | await instance.AsTask().Execute(value => value.Should().Be(T.Value));
25 |
26 | instance.Value.Should().Be(T.Value);
27 | }
28 | }
29 | }
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/ExecuteTests.Task.Right.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 | using FluentAssertions;
3 | using Xunit;
4 |
5 | namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions
6 | {
7 | public class ExecuteTests_Task_Right : MaybeTestBase
8 | {
9 | [Fact]
10 | public async Task Execute_Task_Right_does_not_execute_action_if_no_value()
11 | {
12 | Maybe instance = null;
13 |
14 | await instance.Execute(value =>
15 | {
16 | instance = T.Value;
17 | return Task.CompletedTask;
18 | });
19 |
20 | instance.HasNoValue.Should().BeTrue();
21 | }
22 |
23 | [Fact]
24 | public async Task Execute_Task_Right_executes_action_if_value()
25 | {
26 | Maybe instance = T.Value;
27 |
28 | await instance.Execute(value =>
29 | {
30 | value.Should().Be(T.Value);
31 | return Task.CompletedTask;
32 | });
33 |
34 | instance.Value.Should().Be(T.Value);
35 | }
36 | }
37 | }
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/ExecuteTests.Task.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 | using FluentAssertions;
3 | using Xunit;
4 |
5 | namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions
6 | {
7 | public class ExecuteTests_Task : MaybeTestBase
8 | {
9 | [Fact]
10 | public async Task Execute_Task_does_not_execute_action_if_no_value()
11 | {
12 | Maybe instance = null;
13 |
14 | await instance.AsTask().Execute(value =>
15 | {
16 | instance = T.Value;
17 | return Task.CompletedTask;
18 | });
19 |
20 | instance.HasNoValue.Should().BeTrue();
21 | }
22 |
23 | [Fact]
24 | public async Task Execute_Task_executes_action_if_value()
25 | {
26 | Maybe instance = T.Value;
27 |
28 | await instance.AsTask().Execute(value =>
29 | {
30 | value.Should().Be(T.Value);
31 | return Task.CompletedTask;
32 | });
33 |
34 | instance.Value.Should().Be(T.Value);
35 | }
36 | }
37 | }
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/ExecuteTests.ValueTask.Left.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 | using CSharpFunctionalExtensions.ValueTasks;
3 | using FluentAssertions;
4 | using Xunit;
5 |
6 | namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions
7 | {
8 | public class ExecuteTests_ValueTask_Left : MaybeTestBase
9 | {
10 | [Fact]
11 | public async Task Execute_ValueTask_Lef_does_not_execute_action_if_no_value()
12 | {
13 | Maybe instance = null;
14 |
15 | await instance.AsValueTask().Execute(value => instance = T.Value);
16 |
17 | instance.HasNoValue.Should().BeTrue();
18 | }
19 |
20 | [Fact]
21 | public async Task Execute_ValueTask_Lef_executes_action_if_value()
22 | {
23 | Maybe instance = T.Value;
24 |
25 | await instance.AsValueTask().Execute(value => value.Should().Be(T.Value));
26 |
27 | instance.Value.Should().Be(T.Value);
28 | }
29 | }
30 | }
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/ExecuteTests.ValueTask.Right.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 | using CSharpFunctionalExtensions.ValueTasks;
3 | using FluentAssertions;
4 | using Xunit;
5 |
6 | namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions
7 | {
8 | public class ExecuteTests_ValueTask_Right : MaybeTestBase
9 | {
10 | [Fact]
11 | public async Task Execute_ValueTask_Right_does_not_execute_action_if_no_value()
12 | {
13 | Maybe instance = null;
14 |
15 | await instance.Execute(value =>
16 | {
17 | instance = T.Value;
18 | return ValueTask.CompletedTask;
19 | });
20 |
21 | instance.HasNoValue.Should().BeTrue();
22 | }
23 |
24 | [Fact]
25 | public async Task Execute_ValueTask_Right_executes_action_if_value()
26 | {
27 | Maybe instance = T.Value;
28 |
29 | await instance.Execute(value =>
30 | {
31 | value.Should().Be(T.Value);
32 | return ValueTask.CompletedTask;
33 | });
34 |
35 | instance.Value.Should().Be(T.Value);
36 | }
37 | }
38 | }
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/ExecuteTests.ValueTask.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 | using CSharpFunctionalExtensions.ValueTasks;
3 | using FluentAssertions;
4 | using Xunit;
5 |
6 | namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions
7 | {
8 | public class ExecuteTests_ValueTask : MaybeTestBase
9 | {
10 | [Fact]
11 | public async Task Execute_ValueTask_does_not_execute_action_if_no_value()
12 | {
13 | Maybe instance = null;
14 |
15 | await instance.AsValueTask().Execute(value =>
16 | {
17 | instance = T.Value;
18 | return ValueTask.CompletedTask;
19 | });
20 |
21 | instance.HasNoValue.Should().BeTrue();
22 | }
23 |
24 | [Fact]
25 | public async Task Execute_ValueTask_executes_action_if_value()
26 | {
27 | Maybe instance = T.Value;
28 |
29 | await instance.AsValueTask().Execute(value =>
30 | {
31 | value.Should().Be(T.Value);
32 | return ValueTask.CompletedTask;
33 | });
34 |
35 | instance.Value.Should().Be(T.Value);
36 | }
37 | }
38 | }
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/ExecuteTests.cs:
--------------------------------------------------------------------------------
1 | using FluentAssertions;
2 | using Xunit;
3 |
4 | namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions
5 | {
6 | public class ExecuteTests : MaybeTestBase
7 | {
8 | [Fact]
9 | public void Execute_does_not_execute_action_if_no_value()
10 | {
11 | Maybe instance = null;
12 |
13 | instance.Execute(value => instance = T.Value);
14 |
15 | instance.HasNoValue.Should().BeTrue();
16 | }
17 |
18 | [Fact]
19 | public void Execute_executes_action_if_value()
20 | {
21 | Maybe instance = T.Value;
22 |
23 | instance.Execute(value => value.Should().Be(T.Value));
24 |
25 | instance.Value.Should().Be(T.Value);
26 | }
27 | }
28 | }
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/GetValueOrDefaultTests.cs:
--------------------------------------------------------------------------------
1 | using CSharpFunctionalExtensions.Tests.ResultTests;
2 | using FluentAssertions;
3 | using Xunit;
4 |
5 | namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions;
6 |
7 | public class GetValueOrDefaultTests : TestBase
8 | {
9 |
10 | [Fact]
11 | public void GetValueOrDefault_extracts_value_if_not_null()
12 | {
13 | Maybe maybe = T.Value;
14 |
15 | T myClass = maybe.GetValueOrDefault();
16 |
17 | myClass.Should().Be(T.Value);
18 | }
19 |
20 | [Fact]
21 | public void GetValueOrDefault_extracts_null_if_no_value()
22 | {
23 | Maybe maybe = null;
24 |
25 | T myClass = maybe.GetValueOrDefault();
26 |
27 | myClass.Should().BeNull();
28 | }
29 |
30 | [Fact]
31 | public void Can_use_selector_in_GetValueOrDefault()
32 | {
33 | Maybe maybe = new MyClass { Property = "Some value" };
34 |
35 | string value = maybe.GetValueOrDefault(x => x.Property);
36 |
37 | value.Should().Be("Some value");
38 | }
39 |
40 | [Fact]
41 | public void Can_use_default_value_in_GetValueOrDefault()
42 | {
43 | Maybe maybe = null;
44 |
45 | string value = maybe.GetValueOrDefault("");
46 |
47 | value.Should().Be("");
48 | }
49 |
50 | private class MyClass
51 | {
52 | public string Property { get; set; }
53 | }
54 | }
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/GetValueOrThrowTests.Task.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Threading.Tasks;
3 | using FluentAssertions;
4 | using Xunit;
5 |
6 | namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions
7 | {
8 | public class GetValueOrThrowTests_Task : MaybeTestBase
9 | {
10 |
11 | [Fact]
12 | public async Task GetValueOrThrow_Task_throws_with_message_if_source_is_empty()
13 | {
14 | const string errorMessage = "Maybe is none";
15 |
16 | Func> func = () => Maybe.None.AsTask().GetValueOrThrow(errorMessage);
17 |
18 | await func.Should().ThrowAsync().WithMessage(errorMessage);
19 | }
20 |
21 | [Fact]
22 | public async Task GetValueOrThrow_Task_returns_value_if_source_has_value()
23 | {
24 | const int value = 1;
25 | var maybe = Maybe.From(value).AsTask();
26 |
27 | const string errorMessage = "Maybe is none";
28 | var result = await maybe.GetValueOrThrow(errorMessage);
29 |
30 | result.Should().Be(value);
31 | }
32 | }
33 | }
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/GetValueOrThrowTests.ValueTask.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Threading.Tasks;
3 | using CSharpFunctionalExtensions.ValueTasks;
4 | using FluentAssertions;
5 | using Xunit;
6 |
7 | namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions
8 | {
9 | public class GetValueOrThrowTests_ValueTask : MaybeTestBase
10 | {
11 |
12 | [Fact]
13 | public void Async_GetValueOrThrow_throws_with_message_if_source_is_empty()
14 | {
15 | const string errorMessage = "Maybe is none";
16 |
17 | Func> func = async () => await Maybe.None.AsValueTask().GetValueOrThrow(errorMessage);
18 |
19 | func.Should().ThrowAsync().WithMessage(errorMessage);
20 | }
21 |
22 | [Fact]
23 | public async Task Async_GetValueOrThrow_returns_value_if_source_has_value()
24 | {
25 | const int value = 1;
26 | var maybe = Maybe.From(value).AsValueTask();
27 |
28 | const string errorMessage = "Maybe is none";
29 | var result = await maybe.GetValueOrThrow(errorMessage);
30 |
31 | result.Should().Be(value);
32 | }
33 | }
34 | }
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/MapTests.Task.Left.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 | using FluentAssertions;
3 | using Xunit;
4 |
5 | namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions
6 | {
7 | public class MapTests_Task_Left : MaybeTestBase
8 | {
9 | [Fact]
10 | public async Task Map_Task_Left_returns_mapped_value()
11 | {
12 | Maybe maybe = T.Value;
13 |
14 | var maybe2 = await maybe.AsTask().Map(ExpectAndReturn(T.Value, T.Value2));
15 |
16 | maybe2.HasValue.Should().BeTrue();
17 | maybe2.Value.Should().Be(T.Value2);
18 | }
19 |
20 | [Fact]
21 | public async Task Map_Task_Left_returns_no_value_if_initial_maybe_is_null()
22 | {
23 | Maybe maybe = null;
24 |
25 | var maybe2 = await maybe.AsTask().Map(ExpectAndReturn(null, T.Value2));
26 |
27 | maybe2.HasValue.Should().BeFalse();
28 | }
29 |
30 | [Fact]
31 | public async Task Map_Task_Left_provides_context_to_selector()
32 | {
33 | Maybe maybe = T.Value;
34 | var context = 5;
35 |
36 | var maybe2 = await maybe
37 | .AsTask()
38 | .Map(
39 | (value, ctx) =>
40 | {
41 | ctx.Should().Be(context);
42 | return value;
43 | },
44 | context
45 | );
46 |
47 | maybe2.HasValue.Should().BeTrue();
48 | }
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/MapTests.Task.Right.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 | using FluentAssertions;
3 | using Xunit;
4 |
5 | namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions
6 | {
7 | public class MapTests_Task_Right : MaybeTestBase
8 | {
9 | [Fact]
10 | public async Task Map_Task_Right_returns_mapped_value()
11 | {
12 | Maybe maybe = T.Value;
13 |
14 | var maybe2 = await maybe.Map(ExpectAndReturn_Task(T.Value, T.Value2));
15 |
16 | maybe2.HasValue.Should().BeTrue();
17 | maybe2.Value.Should().Be(T.Value2);
18 | }
19 |
20 | [Fact]
21 | public async Task Map_Task_Right_returns_no_value_if_initial_maybe_is_null()
22 | {
23 | Maybe maybe = null;
24 |
25 | var maybe2 = await maybe.Map(ExpectAndReturn_Task(null, T.Value2));
26 |
27 | maybe2.HasValue.Should().BeFalse();
28 | }
29 |
30 | [Fact]
31 | public async Task Map_Task_Right_provides_context_to_selector()
32 | {
33 | Maybe maybe = T.Value;
34 | var context = 5;
35 |
36 | var maybe2 = await maybe.Map(
37 | (value, ctx) =>
38 | {
39 | ctx.Should().Be(context);
40 | return value.AsTask();
41 | },
42 | context
43 | );
44 |
45 | maybe2.HasValue.Should().BeTrue();
46 | }
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/MapTests.Task.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 | using FluentAssertions;
3 | using Xunit;
4 |
5 | namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions
6 | {
7 | public class MapTests_Task : MaybeTestBase
8 | {
9 | [Fact]
10 | public async Task Map_Task_returns_mapped_value()
11 | {
12 | Maybe maybe = T.Value;
13 |
14 | var maybe2 = await maybe.AsTask().Map(ExpectAndReturn_Task(T.Value, T.Value2));
15 |
16 | maybe2.HasValue.Should().BeTrue();
17 | maybe2.Value.Should().Be(T.Value2);
18 | }
19 |
20 | [Fact]
21 | public async Task Map_Task_returns_no_value_if_initial_maybe_is_null()
22 | {
23 | Maybe maybe = null;
24 |
25 | var maybe2 = await maybe.AsTask().Map(ExpectAndReturn_Task(null, T.Value2));
26 |
27 | maybe2.HasValue.Should().BeFalse();
28 | }
29 |
30 | [Fact]
31 | public async Task Map_Task_provides_context_to_selector()
32 | {
33 | Maybe maybe = T.Value;
34 | var context = 5;
35 |
36 | var maybe2 = await maybe
37 | .AsTask()
38 | .Map(
39 | (value, ctx) =>
40 | {
41 | ctx.Should().Be(context);
42 | return value.AsTask();
43 | },
44 | context
45 | );
46 |
47 | maybe2.HasValue.Should().BeTrue();
48 | }
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/MapTests.cs:
--------------------------------------------------------------------------------
1 | using FluentAssertions;
2 | using Xunit;
3 |
4 | namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions
5 | {
6 | public class MapTests : MaybeTestBase
7 | {
8 | [Fact]
9 | public void Map_returns_mapped_value()
10 | {
11 | Maybe maybe = T.Value;
12 |
13 | var maybe2 = maybe.Map(ExpectAndReturn(T.Value, T.Value2));
14 |
15 | maybe2.HasValue.Should().BeTrue();
16 | maybe2.Value.Should().Be(T.Value2);
17 | }
18 |
19 | [Fact]
20 | public void Map_returns_no_value_if_initial_maybe_is_null()
21 | {
22 | Maybe maybe = null;
23 |
24 | var maybe2 = maybe.Map(ExpectAndReturn(null, T.Value2));
25 |
26 | maybe2.HasValue.Should().BeFalse();
27 | }
28 |
29 | [Fact]
30 | public void Map_provides_context_to_selector()
31 | {
32 | Maybe maybe = T.Value;
33 | var context = 5;
34 |
35 | var maybe2 = maybe.Map(
36 | (value, ctx) =>
37 | {
38 | ctx.Should().Be(context);
39 | return value;
40 | },
41 | context
42 | );
43 |
44 | maybe2.HasValue.Should().BeTrue();
45 | }
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/OptionalTests.cs:
--------------------------------------------------------------------------------
1 | using FluentAssertions;
2 | using Xunit;
3 |
4 | namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions;
5 |
6 | public class OptionalTests
7 | {
8 | [Fact]
9 | public void Optional_AbsentResult_ShouldBeSuccessWithNoValue()
10 | {
11 | var absent = Maybe>.None.Optional();
12 |
13 | absent.IsSuccess.Should().BeTrue();
14 | absent.Value.HasNoValue.Should().BeTrue();
15 | }
16 |
17 | [Fact]
18 | public void Optional_PresentFailedResult_ShouldBeFailureWithError()
19 | {
20 | var presentFailed = Maybe.From(Result.Failure("oops")).Optional();
21 |
22 | presentFailed.IsFailure.Should().BeTrue();
23 | presentFailed.Error.Should().Be("oops");
24 | }
25 |
26 | [Fact]
27 | public void Optional_PresentSuccessResult_ShouldBeSuccessWithValue()
28 | {
29 | var presentSuccess = Maybe.From(Result.Success("yay")).Optional();
30 |
31 | presentSuccess.IsSuccess.Should().BeTrue();
32 | presentSuccess.Value.Value.Should().Be("yay");
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/OrTests.Task.Left.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 | using FluentAssertions;
3 | using Xunit;
4 |
5 | namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions
6 | {
7 | public class OrTests_Task_Left : MaybeTestBase
8 | {
9 | [Fact]
10 | public async Task Or_Task_Left_fallback_value_returns_source_if_source_has_value()
11 | {
12 | Maybe maybe = T.Value;
13 |
14 | var maybe2 = await maybe.AsTask().Or(T.Value2);
15 |
16 | maybe2.HasValue.Should().BeTrue();
17 | maybe2.Should().Be(T.Value);
18 | }
19 |
20 | [Fact]
21 | public async Task Or_Task_Left_fallback_value_returns_a_new_instance_with_value_when_source_is_empty()
22 | {
23 | var maybeTask = Maybe.None;
24 |
25 | var maybe2 = await maybeTask.AsTask().Or(T.Value2);
26 |
27 | maybe2.HasValue.Should().BeTrue();
28 | maybe2.Should().Be(T.Value2);
29 | }
30 | }
31 | }
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/OrTests.Task.Right.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 | using FluentAssertions;
3 | using Xunit;
4 |
5 | namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions
6 | {
7 | public class OrTests_Task_Right : MaybeTestBase
8 | {
9 | [Fact]
10 | public async Task Or_Task_Right_fallback_value_returns_source_if_source_has_value()
11 | {
12 | Maybe maybe = T.Value;
13 |
14 | var maybe2 = await maybe.Or(() => T.Value2.AsTask());
15 |
16 | maybe2.HasValue.Should().BeTrue();
17 | maybe2.Should().Be(T.Value);
18 | }
19 |
20 | [Fact]
21 | public async Task Or_Task_Right_fallback_value_returns_a_new_instance_with_value_when_source_is_empty()
22 | {
23 | var maybeTask = Maybe.None;
24 |
25 | var maybe2 = await maybeTask.Or(() => T.Value2.AsTask());
26 |
27 | maybe2.HasValue.Should().BeTrue();
28 | maybe2.Should().Be(T.Value2);
29 | }
30 | }
31 | }
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/OrTests.Task.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 | using FluentAssertions;
3 | using Xunit;
4 |
5 | namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions
6 | {
7 | public class OrTests_Task : MaybeTestBase
8 | {
9 | [Fact]
10 | public async Task Or_Task_fallback_value_returns_source_if_source_has_value()
11 | {
12 | Maybe maybe = T.Value;
13 |
14 | var maybe2 = await maybe.AsTask().Or(T.Value2.AsTask());
15 |
16 | maybe2.HasValue.Should().BeTrue();
17 | maybe2.Should().Be(T.Value);
18 | }
19 |
20 | [Fact]
21 | public async Task Or_Task_fallback_value_returns_a_new_instance_with_value_when_source_is_empty()
22 | {
23 | var maybeTask = Maybe.None;
24 |
25 | var maybe2 = await maybeTask.AsTask().Or(T.Value2.AsTask());
26 |
27 | maybe2.HasValue.Should().BeTrue();
28 | maybe2.Should().Be(T.Value2);
29 | }
30 | }
31 | }
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/OrTests.ValueTask.Left.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 | using CSharpFunctionalExtensions.ValueTasks;
3 | using FluentAssertions;
4 | using Xunit;
5 |
6 | namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions
7 | {
8 | public class OrTests_ValueTask_Left : MaybeTestBase
9 | {
10 | [Fact]
11 | public async Task Or_ValueTask_Left_fallback_value_returns_source_if_source_has_value()
12 | {
13 | Maybe maybe = T.Value;
14 |
15 | var maybe2 = await maybe.AsValueTask().Or(T.Value2);
16 |
17 | maybe2.HasValue.Should().BeTrue();
18 | maybe2.Should().Be(T.Value);
19 | }
20 |
21 | [Fact]
22 | public async Task Or_ValueTask_Left_fallback_value_returns_a_new_instance_with_value_when_source_is_empty()
23 | {
24 | var maybeValueTask = Maybe.None;
25 |
26 | var maybe2 = await maybeValueTask.AsValueTask().Or(T.Value2);
27 |
28 | maybe2.HasValue.Should().BeTrue();
29 | maybe2.Should().Be(T.Value2);
30 | }
31 | }
32 | }
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/OrTests.ValueTask.Right.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 | using CSharpFunctionalExtensions.ValueTasks;
3 | using FluentAssertions;
4 | using Xunit;
5 |
6 | namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions
7 | {
8 | public class OrTests_ValueTask_Right : MaybeTestBase
9 | {
10 | [Fact]
11 | public async Task Or_ValueTask_Right_fallback_value_returns_source_if_source_has_value()
12 | {
13 | Maybe maybe = T.Value;
14 |
15 | var maybe2 = await maybe.Or(() => T.Value2.AsValueTask());
16 |
17 | maybe2.HasValue.Should().BeTrue();
18 | maybe2.Should().Be(T.Value);
19 | }
20 |
21 | [Fact]
22 | public async Task Or_ValueTask_Right_fallback_value_returns_a_new_instance_with_value_when_source_is_empty()
23 | {
24 | var maybeValueTask = Maybe.None;
25 |
26 | var maybe2 = await maybeValueTask.Or(() => T.Value2.AsValueTask());
27 |
28 | maybe2.HasValue.Should().BeTrue();
29 | maybe2.Should().Be(T.Value2);
30 | }
31 | }
32 | }
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/OrTests.ValueTask.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 | using CSharpFunctionalExtensions.ValueTasks;
3 | using FluentAssertions;
4 | using Xunit;
5 |
6 | namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions
7 | {
8 | public class OrTests_ValueTask : MaybeTestBase
9 | {
10 | [Fact]
11 | public async Task Or_ValueTask_fallback_value_returns_source_if_source_has_value()
12 | {
13 | Maybe maybe = T.Value;
14 |
15 | var maybe2 = await maybe.AsValueTask().Or(T.Value2.AsValueTask());
16 |
17 | maybe2.HasValue.Should().BeTrue();
18 | maybe2.Should().Be(T.Value);
19 | }
20 |
21 | [Fact]
22 | public async Task Or_ValueTask_fallback_value_returns_a_new_instance_with_value_when_source_is_empty()
23 | {
24 | var maybeValueTask = Maybe.None;
25 |
26 | var maybe2 = await maybeValueTask.AsValueTask().Or(T.Value2.AsValueTask());
27 |
28 | maybe2.HasValue.Should().BeTrue();
29 | maybe2.Should().Be(T.Value2);
30 | }
31 | }
32 | }
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/SelectTests.cs:
--------------------------------------------------------------------------------
1 | using FluentAssertions;
2 | using Xunit;
3 |
4 | namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions;
5 |
6 | public class SelectTests
7 | {
8 | [Fact]
9 | public void Select_returns_new_maybe()
10 | {
11 | Maybe maybe = new MyClass { Property = "Some value" };
12 |
13 | Maybe maybe2 = maybe.Select(x => x.Property);
14 |
15 | maybe2.HasValue.Should().BeTrue();
16 | maybe2.Value.Should().Be("Some value");
17 | }
18 |
19 | [Fact]
20 | public void Select_returns_no_value_if_no_value_passed_in()
21 | {
22 | Maybe maybe = null;
23 |
24 | Maybe maybe2 = maybe.Select(x => x.Property);
25 |
26 | maybe2.HasValue.Should().BeFalse();
27 | }
28 |
29 | private class MyClass
30 | {
31 | public string Property { get; set; }
32 | }
33 | }
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/ToListTest.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using CSharpFunctionalExtensions.Tests.ResultTests;
3 | using FluentAssertions;
4 | using Xunit;
5 |
6 | namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions;
7 |
8 | public class ToListTest : TestBase
9 | {
10 |
11 | [Fact]
12 | public void ToList_gives_empty_list_if_null()
13 | {
14 | Maybe maybe = null;
15 |
16 | List myClasses = maybe.ToList();
17 |
18 | myClasses.Count.Should().Be(0);
19 | }
20 |
21 | [Fact]
22 | public void ToList_gives_single_item_list_if_not_null()
23 | {
24 | Maybe maybe = T.Value;
25 |
26 | List myClasses = maybe.ToList();
27 |
28 | myClasses.Count.Should().Be(1);
29 | myClasses[0].Should().Be(T.Value);
30 | }
31 | }
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/TryFindTests.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using FluentAssertions;
3 | using Xunit;
4 |
5 | namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions;
6 |
7 | public class TryFindTests
8 | {
9 | [Fact]
10 | public void TryFind_dict_does_not_contains_key()
11 | {
12 | var dict = new Dictionary();
13 |
14 | var maybe = dict.TryFind("key");
15 |
16 | maybe.HasValue.Should().BeFalse();
17 | }
18 | }
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/WhereTests.Task.Left.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 | using FluentAssertions;
3 | using Xunit;
4 |
5 | namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions
6 | {
7 | public class WhereTests_Task_Left : MaybeTestBase
8 | {
9 | [Fact]
10 | public async Task Where_Task_Left_returns_value_if_predicate_returns_true()
11 | {
12 | Maybe maybe = T.Value;
13 |
14 | var maybe2 = await maybe.AsTask().Where(ExpectAndReturn(T.Value, true));
15 |
16 | maybe2.HasValue.Should().BeTrue();
17 | maybe2.Value.Should().Be(T.Value);
18 | }
19 |
20 | [Fact]
21 | public async Task Where_Task_Left_returns_no_value_if_predicate_returns_false()
22 | {
23 | Maybe maybe = T.Value;
24 |
25 | var maybe2 = await maybe.AsTask().Where(ExpectAndReturn(T.Value, false));
26 |
27 | maybe2.HasValue.Should().BeFalse();
28 | }
29 |
30 | [Theory]
31 | [InlineData(true)]
32 | [InlineData(false)]
33 | public async Task Where_Task_Left_returns_no_value_if_initial_maybe_is_null(bool predicateResult)
34 | {
35 | Maybe maybe = null;
36 |
37 | var maybe2 = await maybe.AsTask().Where(ExpectAndReturn(null, predicateResult));
38 |
39 | maybe2.HasValue.Should().BeFalse();
40 | }
41 | }
42 | }
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/WhereTests.Task.Right.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 | using FluentAssertions;
3 | using Xunit;
4 |
5 | namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions
6 | {
7 | public class WhereTests_Task_Right : MaybeTestBase
8 | {
9 | [Fact]
10 | public async Task Where_Task_Right_returns_value_if_predicate_returns_true()
11 | {
12 | Maybe maybe = T.Value;
13 |
14 | var maybe2 = await maybe.Where(ExpectAndReturn_Task(T.Value, true));
15 |
16 | maybe2.HasValue.Should().BeTrue();
17 | maybe2.Value.Should().Be(T.Value);
18 | }
19 |
20 | [Fact]
21 | public async Task Where_Task_Right_returns_no_value_if_predicate_returns_false()
22 | {
23 | Maybe maybe = T.Value;
24 |
25 | var maybe2 = await maybe.Where(ExpectAndReturn_Task(T.Value, false));
26 |
27 | maybe2.HasValue.Should().BeFalse();
28 | }
29 |
30 | [Theory]
31 | [InlineData(true)]
32 | [InlineData(false)]
33 | public async Task Where_Task_Right_returns_no_value_if_initial_maybe_is_null(bool predicateResult)
34 | {
35 | Maybe maybe = null;
36 |
37 | var maybe2 = await maybe.Where(ExpectAndReturn_Task(null, predicateResult));
38 |
39 | maybe2.HasValue.Should().BeFalse();
40 | }
41 | }
42 | }
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/WhereTests.Task.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 | using FluentAssertions;
3 | using Xunit;
4 |
5 | namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions
6 | {
7 | public class WhereTests_Task : MaybeTestBase
8 | {
9 | [Fact]
10 | public async Task Where_Task_returns_value_if_predicate_returns_true()
11 | {
12 | Maybe maybe = T.Value;
13 |
14 | var maybe2 = await maybe.AsTask().Where(ExpectAndReturn_Task(T.Value, true));
15 |
16 | maybe2.HasValue.Should().BeTrue();
17 | maybe2.Value.Should().Be(T.Value);
18 | }
19 |
20 | [Fact]
21 | public async Task Where_Task_returns_no_value_if_predicate_returns_false()
22 | {
23 | Maybe maybe = T.Value;
24 |
25 | var maybe2 = await maybe.AsTask().Where(ExpectAndReturn_Task(T.Value, false));
26 |
27 | maybe2.HasValue.Should().BeFalse();
28 | }
29 |
30 | [Theory]
31 | [InlineData(true)]
32 | [InlineData(false)]
33 | public async Task Where_Task_returns_no_value_if_initial_maybe_is_null(bool predicateResult)
34 | {
35 | Maybe maybe = null;
36 |
37 | var maybe2 = await maybe.AsTask().Where(ExpectAndReturn_Task(null, predicateResult));
38 |
39 | maybe2.HasValue.Should().BeFalse();
40 | }
41 | }
42 | }
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/WhereTests.ValueTask.Left.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 | using CSharpFunctionalExtensions.ValueTasks;
3 | using FluentAssertions;
4 | using Xunit;
5 |
6 | namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions
7 | {
8 | public class WhereTests_ValueTask_Left : MaybeTestBase
9 | {
10 | [Fact]
11 | public async ValueTask Where_ValueTask_Left_returns_value_if_predicate_returns_true()
12 | {
13 | Maybe maybe = T.Value;
14 |
15 | var maybe2 = await maybe.AsValueTask().Where(ExpectAndReturn(T.Value, true));
16 |
17 | maybe2.HasValue.Should().BeTrue();
18 | maybe2.Value.Should().Be(T.Value);
19 | }
20 |
21 | [Fact]
22 | public async ValueTask Where_ValueTask_Left_returns_no_value_if_predicate_returns_false()
23 | {
24 | Maybe maybe = T.Value;
25 |
26 | var maybe2 = await maybe.AsValueTask().Where(ExpectAndReturn(T.Value, false));
27 |
28 | maybe2.HasValue.Should().BeFalse();
29 | }
30 |
31 | [Theory]
32 | [InlineData(true)]
33 | [InlineData(false)]
34 | public async ValueTask Where_ValueTask_Left_returns_no_value_if_initial_maybe_is_null(bool predicateResult)
35 | {
36 | Maybe maybe = null;
37 |
38 | var maybe2 = await maybe.AsValueTask().Where(ExpectAndReturn(null, predicateResult));
39 |
40 | maybe2.HasValue.Should().BeFalse();
41 | }
42 | }
43 | }
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/WhereTests.ValueTask.Right.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 | using CSharpFunctionalExtensions.ValueTasks;
3 | using FluentAssertions;
4 | using Xunit;
5 |
6 | namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions
7 | {
8 | public class WhereTests_ValueTask_Right : MaybeTestBase
9 | {
10 | [Fact]
11 | public async ValueTask Where_ValueTask_Right_returns_value_if_predicate_returns_true()
12 | {
13 | Maybe maybe = T.Value;
14 |
15 | var maybe2 = await maybe.Where(ExpectAndReturn_ValueTask(T.Value, true));
16 |
17 | maybe2.HasValue.Should().BeTrue();
18 | maybe2.Value.Should().Be(T.Value);
19 | }
20 |
21 | [Fact]
22 | public async ValueTask Where_ValueTask_Right_returns_no_value_if_predicate_returns_false()
23 | {
24 | Maybe maybe = T.Value;
25 |
26 | var maybe2 = await maybe.Where(ExpectAndReturn_ValueTask(T.Value, false));
27 |
28 | maybe2.HasValue.Should().BeFalse();
29 | }
30 |
31 | [Theory]
32 | [InlineData(true)]
33 | [InlineData(false)]
34 | public async ValueTask Where_ValueTask_Right_returns_no_value_if_initial_maybe_is_null(bool predicateResult)
35 | {
36 | Maybe maybe = null;
37 |
38 | var maybe2 = await maybe.Where(ExpectAndReturn_ValueTask(null, predicateResult));
39 |
40 | maybe2.HasValue.Should().BeFalse();
41 | }
42 | }
43 | }
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/WhereTests.ValueTask.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 | using CSharpFunctionalExtensions.ValueTasks;
3 | using FluentAssertions;
4 | using Xunit;
5 |
6 | namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions
7 | {
8 | public class WhereTests_ValueTask : MaybeTestBase
9 | {
10 | [Fact]
11 | public async ValueTask Where_ValueTask_returns_value_if_predicate_returns_true()
12 | {
13 | Maybe maybe = T.Value;
14 |
15 | var maybe2 = await maybe.AsValueTask().Where(ExpectAndReturn_ValueTask(T.Value, true));
16 |
17 | maybe2.HasValue.Should().BeTrue();
18 | maybe2.Value.Should().Be(T.Value);
19 | }
20 |
21 | [Fact]
22 | public async ValueTask Where_ValueTask_returns_no_value_if_predicate_returns_false()
23 | {
24 | Maybe maybe = T.Value;
25 |
26 | var maybe2 = await maybe.AsValueTask().Where(ExpectAndReturn_ValueTask(T.Value, false));
27 |
28 | maybe2.HasValue.Should().BeFalse();
29 | }
30 |
31 | [Theory]
32 | [InlineData(true)]
33 | [InlineData(false)]
34 | public async ValueTask Where_ValueTask_returns_no_value_if_initial_maybe_is_null(bool predicateResult)
35 | {
36 | Maybe maybe = null;
37 |
38 | var maybe2 = await maybe.AsValueTask().Where(ExpectAndReturn_ValueTask(null, predicateResult));
39 |
40 | maybe2.HasValue.Should().BeFalse();
41 | }
42 | }
43 | }
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/WhereTests.cs:
--------------------------------------------------------------------------------
1 | using FluentAssertions;
2 | using Xunit;
3 |
4 | namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions
5 | {
6 | public class WhereTests : MaybeTestBase
7 | {
8 | [Fact]
9 | public void Where_returns_value_if_predicate_returns_true()
10 | {
11 | Maybe maybe = T.Value;
12 |
13 | var maybe2 = maybe.Where(ExpectAndReturn(T.Value, true));
14 |
15 | maybe2.HasValue.Should().BeTrue();
16 | maybe2.Value.Should().Be(T.Value);
17 | }
18 |
19 | [Fact]
20 | public void Where_returns_no_value_if_predicate_returns_false()
21 | {
22 | Maybe maybe = T.Value;
23 |
24 | var maybe2 = maybe.Where(ExpectAndReturn(T.Value, false));
25 |
26 | maybe2.HasValue.Should().BeFalse();
27 | }
28 |
29 | [Theory]
30 | [InlineData(true)]
31 | [InlineData(false)]
32 | public void Where_returns_no_value_if_initial_maybe_is_null(bool predicateResult)
33 | {
34 | Maybe maybe = null;
35 |
36 | var maybe2 = maybe.Where(ExpectAndReturn(null, predicateResult));
37 |
38 | maybe2.HasValue.Should().BeFalse();
39 | }
40 | }
41 | }
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/MaybeTests/ImplicitConversionTests.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using FluentAssertions;
4 | using Xunit;
5 |
6 | namespace CSharpFunctionalExtensions.Tests.MaybeTests
7 | {
8 | public class ImplicitConversionTests
9 | {
10 | [Fact]
11 | public void Implicit_conversion_of_reference_type()
12 | {
13 | StringVO stringVo = default;
14 |
15 | // ReSharper disable once ExpressionIsAlwaysNull
16 | string stringPrimitive = stringVo;
17 |
18 | stringPrimitive.Should().BeNull();
19 | }
20 |
21 | [Fact]
22 | public void Implicit_conversion_of_value_type()
23 | {
24 | IntVO intVo = default;
25 |
26 | // ReSharper disable once ExpressionIsAlwaysNull
27 | int intPrimitive = intVo;
28 |
29 | intPrimitive.Should().Be(0);
30 | }
31 |
32 | public class StringVO : SimpleValueObject
33 | {
34 | public StringVO(string value)
35 | : base(value)
36 | {
37 | }
38 |
39 | protected override IEnumerable GetComparableEqualityComponents()
40 | {
41 | yield return Value.ToLower();
42 | }
43 | }
44 |
45 | public class IntVO : SimpleValueObject
46 | {
47 | public IntVO(int value)
48 | : base(value)
49 | {
50 | }
51 | }
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/NonParallelTestCollectionAttribute.cs:
--------------------------------------------------------------------------------
1 | using Xunit;
2 |
3 | namespace CSharpFunctionalExtensions.Tests
4 | {
5 | [CollectionDefinition(Name, DisableParallelization = true)]
6 | public sealed class NonParallelTestCollectionDefinition
7 | {
8 | internal const string Name = "Non-Parallel Collection";
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/ResultTests/AmbiguityTests.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 | using Xunit;
3 |
4 | namespace CSharpFunctionalExtensions.Tests.ResultTests;
5 |
6 | public class AmbiguityTests
7 | {
8 | [Fact]
9 | public void The_following_method_calls_should_compile_without_raising_ambiguity_errors()
10 | {
11 | GetProfileAsync();
12 | GetProfileWithErrorAsync();
13 | }
14 |
15 | [Fact]
16 | public async Task The_following_code_should_compile_without_raising_ambiguity_errors()
17 | {
18 | Result result = Result.Success(new());
19 |
20 | Task> GetTask() => Task.FromResult(Result.Success(new()));
21 |
22 | await result
23 | .Bind(async _ => await GetTask());
24 | }
25 |
26 | private Task> GetProfileAsync() =>
27 | Result.Try(async () =>
28 | {
29 | await Task.Yield();
30 |
31 | return new Profile();
32 | });
33 |
34 | private Task> GetProfileWithErrorAsync() =>
35 | Result.Try(async () =>
36 | {
37 | await Task.Yield();
38 |
39 | return new Profile();
40 | }, _ => new Error());
41 |
42 | private class Profile
43 | {
44 | }
45 |
46 | private class Error
47 | {
48 | }
49 |
50 | class T1
51 | {
52 | }
53 |
54 | class T2
55 | {
56 | }
57 |
58 | class E
59 | {
60 | }
61 | }
62 |
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/ResultTests/Extensions/AsMaybeTests.cs:
--------------------------------------------------------------------------------
1 | using Xunit;
2 | using FluentAssertions;
3 |
4 | namespace CSharpFunctionalExtensions.Tests.ResultTests.Extensions;
5 |
6 | public class AsMaybeTests : TestBase
7 | {
8 | [Fact]
9 | public void Error_returns_None()
10 | {
11 | var result = Result.Failure(ErrorMessage);
12 | result.AsMaybe().HasValue.Should().BeFalse();
13 | }
14 |
15 | [Fact]
16 | public void Success_returns_Some()
17 | {
18 | var result = Result.Success(T.Value);
19 | var asMaybe = result.AsMaybe();
20 |
21 | asMaybe.HasValue.Should().BeTrue();
22 | asMaybe.Value.Should().Be(T.Value);
23 | }
24 |
25 | [Fact]
26 | public void Null_value_returns_None()
27 | {
28 | var result = Result.Success(null);
29 | var asMaybe = result.AsMaybe();
30 |
31 | asMaybe.HasValue.Should().BeFalse();
32 | }
33 | }
34 |
35 |
36 |
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/ResultTests/Extensions/BindZipTests.cs:
--------------------------------------------------------------------------------
1 | using System.Runtime.CompilerServices;
2 | using FluentAssertions;
3 | using FluentAssertions.Execution;
4 | using Xunit;
5 |
6 | namespace CSharpFunctionalExtensions.Tests.ResultTests.Extensions;
7 |
8 | public class BindZipTests : BindTestsBase
9 | {
10 | [Fact]
11 | public void BindZip_T_with_Bind_K_returns_success()
12 | {
13 | Result<(T, K)> output = Success_T(T.Value).BindZip(_ => Success_K());
14 |
15 | using (var _ = new AssertionScope())
16 | {
17 | AssertSuccess(output);
18 |
19 | (var _, var _, (T t, K k)) = output;
20 | t.Should().Be(T.Value);
21 | k.Should().Be(K.Value);
22 | }
23 | }
24 |
25 | [Fact]
26 | public void BindZip_T_With_Bind_K_eight_times_returns_success()
27 | {
28 | Result<(T, K, K, K, K, K, K, K)> output = Success_T(T.Value)
29 | .BindZip(_ => Success_K())
30 | .BindZip((_, _) => Success_K())
31 | .BindZip((_, _, _) => Success_K())
32 | .BindZip((_, _, _, _) => Success_K())
33 | .BindZip((_, _, _, _, _) => Success_K())
34 | .BindZip((_, _, _, _, _, _) => Success_K())
35 | .BindZip((_, _, _, _, _, _, _) => Success_K());
36 |
37 | ((ITuple)output.Value).Length.Should().Be(8);
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/ResultTests/Extensions/EnsureNotNullTests.Base.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Threading.Tasks;
3 |
4 | namespace CSharpFunctionalExtensions.Tests.ResultTests.Extensions;
5 |
6 | public class EnsureNotNullTests_Base : TestBase
7 | {
8 | protected bool factoryExecuted;
9 |
10 | protected Func GetErrorFactory(E e)
11 | {
12 | return () =>
13 | {
14 | factoryExecuted = true;
15 |
16 | return e;
17 | };
18 | }
19 |
20 | protected Func> GetTaskErrorFactory(E e) => GetErrorFactory(Task.FromResult(e));
21 |
22 | protected Func> GetValueTaskErrorFactory(E e) => GetErrorFactory(ValueTask.FromResult(e));
23 |
24 | protected struct V
25 | {
26 | public static readonly V Value = new V();
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/ResultTests/Extensions/GetValueOrDefaultTests.cs:
--------------------------------------------------------------------------------
1 | using CSharpFunctionalExtensions.Tests.ResultTests;
2 | using FluentAssertions;
3 | using Xunit;
4 |
5 | namespace CSharpFunctionalExtensions.Tests.ResultTests.Extensions;
6 |
7 | public class GetValueOrDefaultTests : TestBase
8 | {
9 |
10 | [Fact]
11 | public void GetValueOrDefault_extracts_value_if_success()
12 | {
13 | Result result = T.Value;
14 |
15 | T myClass = result.GetValueOrDefault();
16 |
17 | myClass.Should().Be(T.Value);
18 | }
19 |
20 | [Fact]
21 | public void GetValueOrDefault_extracts_null_if_failure()
22 | {
23 | Result result = Result.Failure(ErrorMessage);
24 |
25 | T myClass = result.GetValueOrDefault();
26 |
27 | myClass.Should().BeNull();
28 | }
29 |
30 | [Fact]
31 | public void Can_use_selector_in_GetValueOrDefault()
32 | {
33 | Result result = new MyClass { Property = "Some value" };
34 |
35 | string value = result.GetValueOrDefault(x => x.Property);
36 |
37 | value.Should().Be("Some value");
38 | }
39 |
40 | [Fact]
41 | public void Can_use_default_value_in_GetValueOrDefault()
42 | {
43 | Result result = Result.Failure(ErrorMessage);
44 |
45 | string value = result.GetValueOrDefault("");
46 |
47 | value.Should().Be("");
48 | }
49 |
50 | private class MyClass
51 | {
52 | public string Property { get; set; }
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/ResultTests/Extensions/MapTests.Base.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 |
3 | namespace CSharpFunctionalExtensions.Tests.ResultTests.Extensions
4 | {
5 | public abstract class MapTestsBase : TestBase
6 | {
7 | protected bool FuncExecuted;
8 |
9 | protected MapTestsBase()
10 | {
11 | FuncExecuted = false;
12 | }
13 |
14 | protected K Func_K()
15 | {
16 | FuncExecuted = true;
17 | return K.Value;
18 | }
19 |
20 | protected K Func_T_K(T value)
21 | {
22 | FuncExecuted = true;
23 | return K.Value;
24 | }
25 |
26 | protected Task Task_Func_K() => Func_K().AsTask();
27 |
28 | protected Task Task_Func_T_K(T value) => Func_T_K(value).AsTask();
29 |
30 | protected ValueTask ValueTask_Func_K() => Func_K().AsValueTask();
31 |
32 | protected ValueTask ValueTask_Func_T_K(T value) => Func_T_K(value).AsValueTask();
33 |
34 | protected readonly string ContextMessage = "Context data";
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/ResultTests/Extensions/TapTests.Base.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 |
3 | namespace CSharpFunctionalExtensions.Tests.ResultTests.Extensions
4 | {
5 | public abstract class TapTestsBase : TestBase
6 | {
7 | protected bool actionExecuted;
8 |
9 | protected TapTestsBase()
10 | {
11 | actionExecuted = false;
12 | }
13 |
14 | protected void Action()
15 | {
16 | actionExecuted = true;
17 | }
18 |
19 | protected void Action_T(T _)
20 | {
21 | actionExecuted = true;
22 | }
23 |
24 | protected Task Task_Action()
25 | {
26 | actionExecuted = true;
27 | return Task.CompletedTask;
28 | }
29 |
30 | protected Task Task_Action_T(T _)
31 | {
32 | actionExecuted = true;
33 | return Task.CompletedTask;
34 | }
35 |
36 | protected ValueTask ValueTask_Action()
37 | {
38 | actionExecuted = true;
39 | return ValueTask.CompletedTask;
40 | }
41 |
42 | protected ValueTask ValueTask_Action_T(T _)
43 | {
44 | actionExecuted = true;
45 | return ValueTask.CompletedTask;
46 | }
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/ResultTests/Methods/FirstFailureOrSuccessTests.cs:
--------------------------------------------------------------------------------
1 | using FluentAssertions;
2 | using Xunit;
3 |
4 | namespace CSharpFunctionalExtensions.Tests.ResultTests.Methods
5 | {
6 | public class FirstFailureOrSuccessTests
7 | {
8 | [Fact]
9 | public void FirstFailureOrSuccess_returns_the_first_failed_result()
10 | {
11 | Result result1 = Result.Success();
12 | Result result2 = Result.Failure("Failure 1");
13 | Result result3 = Result.Failure("Failure 2");
14 |
15 | Result result = Result.FirstFailureOrSuccess(result1, result2, result3);
16 |
17 | result.IsFailure.Should().BeTrue();
18 | result.Error.Should().Be("Failure 1");
19 | result.Should().Be(result2);
20 | }
21 |
22 | [Fact]
23 | public void FirstFailureOrSuccess_returns_success_if_no_failures()
24 | {
25 | Result result1 = Result.Success();
26 | Result result2 = Result.Success();
27 | Result result3 = Result.Success();
28 |
29 | Result result = Result.FirstFailureOrSuccess(result1, result2, result3);
30 |
31 | result.IsSuccess.Should().BeTrue();
32 | result.Should().Be(Result.Success());
33 | }
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/ResultTests/Methods/TryTest.Base.Common.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace CSharpFunctionalExtensions.Tests.ResultTests.Methods.Try
4 | {
5 | public abstract class TryTestBaseCommon : TestBase
6 | {
7 | protected TryTestBaseCommon()
8 | {
9 | FuncExecuted = false;
10 | }
11 |
12 | protected static readonly Exception Exception = new Exception(ErrorMessage);
13 | protected const string ErrorHandlerMessage = "Error message from error handler";
14 | protected static readonly Func ErrorHandler = exc => ErrorHandlerMessage;
15 | protected static readonly Func ErrorHandler_E = exc => E.Value;
16 |
17 | protected bool FuncExecuted;
18 | }
19 | }
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/ResultTests/Methods/TryTest.Base.cs:
--------------------------------------------------------------------------------
1 | namespace CSharpFunctionalExtensions.Tests.ResultTests.Methods.Try
2 | {
3 | public abstract class TryTestBase : TryTestBaseCommon
4 | {
5 | protected void Action() => FuncExecuted = true;
6 | protected void Action_T(T _) => FuncExecuted = true;
7 |
8 | protected T Func_T()
9 | {
10 | FuncExecuted = true;
11 | return T.Value;
12 | }
13 |
14 | protected K Func_T_K(T _)
15 | {
16 | FuncExecuted = true;
17 | return K.Value;
18 | }
19 |
20 | protected T Throwing_Func_T() => throw Exception;
21 | protected K Throwing_Func_T_K(T _) => throw Exception;
22 | protected void Throwing_Action() => throw Exception;
23 | protected void Throwing_Action_T(T _) => throw Exception;
24 |
25 | }
26 | }
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/ResultTests/Methods/TryValueTaskTest.Base.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 |
3 | namespace CSharpFunctionalExtensions.Tests.ResultTests.Methods.Try
4 | {
5 | public abstract class TryTestBaseValueTask : TryTestBaseCommon
6 | {
7 | protected ValueTask Func_ValueTask()
8 | {
9 | FuncExecuted = true;
10 | return ValueTask.CompletedTask;
11 | }
12 |
13 | protected ValueTask Func_T_ValueTask(T _)
14 | {
15 | FuncExecuted = true;
16 | return ValueTask.CompletedTask;
17 | }
18 |
19 | protected ValueTask Func_ValueTask_T()
20 | {
21 | FuncExecuted = true;
22 | return T.Value.AsValueTask();
23 | }
24 |
25 | protected ValueTask Func_T_ValueTask_K(T _)
26 | {
27 | FuncExecuted = true;
28 | return K.Value.AsValueTask();
29 | }
30 |
31 | protected ValueTask Throwing_Func_ValueTask() => Exception.AsValueTask();
32 | protected ValueTask Throwing_Func_ValueTask_T() => Exception.AsValueTask();
33 | protected ValueTask Throwing_Func_T_ValueTask(T _) => Exception.AsValueTask();
34 | protected ValueTask Throwing_Func_T_ValueTask_K(T _) => Exception.AsValueTask();
35 |
36 | }
37 | }
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/TaskExtensions.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Threading.Tasks;
3 |
4 | namespace CSharpFunctionalExtensions.Tests
5 | {
6 | internal static class TaskExtensions
7 | {
8 | public static Task AsTask(this T obj) => Task.FromResult(obj);
9 | public static Task AsTask(this Exception exception) => Task.FromException(exception);
10 | public static Task AsTask(this Exception exception) => Task.FromException(exception);
11 | }
12 | }
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/ValueObjectTests/AnotherTestEnumValueObject.cs:
--------------------------------------------------------------------------------
1 | namespace CSharpFunctionalExtensions.Tests.ValueObjectTests
2 | {
3 | public sealed class AnotherTestEnumValueObject : EnumValueObject
4 | {
5 | public static readonly AnotherTestEnumValueObject One = new AnotherTestEnumValueObject(1, "name");
6 |
7 | public static readonly AnotherTestEnumValueObject Two = new AnotherTestEnumValueObject(2, "test");
8 |
9 | private AnotherTestEnumValueObject(long id, string name) : base(id, name)
10 | {
11 | }
12 | }
13 | }
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/ValueObjectTests/TestEnumValueObject.cs:
--------------------------------------------------------------------------------
1 | namespace CSharpFunctionalExtensions.Tests.ValueObjectTests
2 | {
3 | public sealed class TestEnumValueObject : EnumValueObject
4 | {
5 | public static readonly TestEnumValueObject One = new TestEnumValueObject(nameof(One));
6 |
7 | public static readonly TestEnumValueObject Two = new TestEnumValueObject(nameof(Two));
8 |
9 | public TestEnumValueObject(string key) : base(key)
10 | {
11 | }
12 | }
13 | }
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions.Tests/ValueTaskExtensions.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Threading.Tasks;
3 | using CSharpFunctionalExtensions.ValueTasks;
4 |
5 | namespace CSharpFunctionalExtensions.Tests
6 | {
7 | internal static class ValueTaskExtensions
8 | {
9 | public static ValueTask AsValueTask(this T obj) => obj.AsCompletedValueTask();
10 | public static ValueTask AsValueTask(this Exception exception) => ValueTask.FromException(exception);
11 | public static ValueTask AsValueTask(this Exception exception) => ValueTask.FromException(exception);
12 | }
13 | }
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions/ICombine.cs:
--------------------------------------------------------------------------------
1 | namespace CSharpFunctionalExtensions
2 | {
3 | public interface ICombine
4 | {
5 | ICombine Combine(ICombine value);
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions/Maybe/Extensions/AsMaybe.Task.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Threading.Tasks;
3 |
4 | namespace CSharpFunctionalExtensions
5 | {
6 | public static partial class MaybeExtensions
7 | {
8 | // ReSharper disable ConvertNullableToShortForm
9 | ///
10 | /// Converts the struct to a .
11 | ///
12 | /// Returns the equivalent to the .
13 | public static async Task> AsMaybe(this Task> nullableTask)
14 | where T : struct
15 | {
16 | var nullable = await nullableTask.DefaultAwait();
17 | return nullable.AsMaybe();
18 | }
19 |
20 | #nullable enable
21 | ///
22 | /// Wraps the class instance in a .
23 | ///
24 | /// Returns if the class instance is null, otherwise returns .
25 | public static async Task> AsMaybe(this Task nullableTask)
26 | where T : class
27 | {
28 | var nullable = await nullableTask.DefaultAwait();
29 | return nullable.AsMaybe();
30 | }
31 | #nullable restore
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions/Maybe/Extensions/AsMaybe.ValueTask.cs:
--------------------------------------------------------------------------------
1 | #if NET5_0_OR_GREATER
2 | using System;
3 | using System.Threading.Tasks;
4 |
5 | namespace CSharpFunctionalExtensions.ValueTasks
6 | {
7 | public static partial class MaybeExtensions
8 | {
9 | // ReSharper disable ConvertNullableToShortForm
10 | ///
11 | /// Converts the struct to a .
12 | ///
13 | /// Returns the equivalent to the .
14 | public static async ValueTask> AsMaybe(this ValueTask> nullableTask)
15 | where T : struct
16 | {
17 | var nullable = await nullableTask;
18 | return nullable.AsMaybe();
19 | }
20 |
21 | #nullable enable
22 | ///
23 | /// Wraps the class instance in a .
24 | ///
25 | /// Returns if the class instance is null, otherwise returns .
26 | public static async ValueTask> AsMaybe(this ValueTask nullableTask)
27 | where T : class
28 | {
29 | var nullable = await nullableTask;
30 | return nullable.AsMaybe();
31 | }
32 | #nullable restore
33 | }
34 | }
35 | #endif
36 |
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions/Maybe/Extensions/AsNullable.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace CSharpFunctionalExtensions
4 | {
5 | public static partial class MaybeExtensions
6 | {
7 | // ReSharper disable ConvertNullableToShortForm
8 | ///
9 | /// Converts the to a struct.
10 | ///
11 | /// Returns the equivalent to the .
12 | #if NET5_0_OR_GREATER
13 | public static Nullable AsNullable(ref this Maybe value)
14 | where T : struct
15 | {
16 | return System.Runtime.CompilerServices.Unsafe.As, Nullable>(ref value);
17 | }
18 | #else
19 | public static Nullable AsNullable(in this Maybe value)
20 | where T : struct
21 | {
22 | // Should use `return Unsafe.AsRef<(ref value);`
23 | if (value.TryGetValue(out var result))
24 | {
25 | return result;
26 | }
27 | return default;
28 | }
29 | #endif
30 | // ReSharper restore ConvertNullableToShortForm
31 | }
32 | }
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions/Maybe/Extensions/Bind.Task.Left.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Threading.Tasks;
3 |
4 | namespace CSharpFunctionalExtensions
5 | {
6 | public static partial class MaybeExtensions
7 | {
8 | public static async Task> Bind(this Task> maybeTask, Func> selector)
9 | {
10 | var maybe = await maybeTask.DefaultAwait();
11 | return maybe.Bind(selector);
12 | }
13 |
14 | public static async Task> Bind(this Task> maybeTask, Func> selector, TContext context)
15 | {
16 | var maybe = await maybeTask.DefaultAwait();
17 | return maybe.Bind(selector, context);
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions/Maybe/Extensions/Bind.Task.Right.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Threading.Tasks;
3 |
4 | namespace CSharpFunctionalExtensions
5 | {
6 | public static partial class MaybeExtensions
7 | {
8 | public static Task> Bind(this Maybe maybe, Func>> selector)
9 | {
10 | if (maybe.HasNoValue)
11 | return Maybe.None.AsCompletedTask();
12 |
13 | return selector(maybe.GetValueOrThrow());
14 | }
15 |
16 | public static Task> Bind(
17 | this Maybe maybe,
18 | Func>> selector,
19 | TContext context)
20 | {
21 | if (maybe.HasNoValue)
22 | return Maybe.None.AsCompletedTask();
23 |
24 | return selector(maybe.GetValueOrThrow(), context);
25 | }
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions/Maybe/Extensions/Bind.Task.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Threading.Tasks;
3 |
4 | namespace CSharpFunctionalExtensions
5 | {
6 | public static partial class MaybeExtensions
7 | {
8 | public static async Task> Bind(this Task> maybeTask, Func>> selector)
9 | {
10 | var maybe = await maybeTask.DefaultAwait();
11 | return await maybe.Bind(selector).DefaultAwait();
12 | }
13 |
14 | public static async Task> Bind(this Task> maybeTask, Func>> selector, TContext context)
15 | {
16 | var maybe = await maybeTask.DefaultAwait();
17 | return await maybe.Bind(selector, context).DefaultAwait();
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions/Maybe/Extensions/Bind.ValueTask.Left.cs:
--------------------------------------------------------------------------------
1 | #if NET5_0_OR_GREATER
2 | using System;
3 | using System.Threading.Tasks;
4 |
5 | namespace CSharpFunctionalExtensions.ValueTasks
6 | {
7 | public static partial class MaybeExtensions
8 | {
9 | public static async ValueTask> Bind(this ValueTask> maybeTask, Func> selector)
10 | {
11 | Maybe maybe = await maybeTask;
12 | return maybe.Bind(selector);
13 | }
14 |
15 | public static async ValueTask> Bind(
16 | this ValueTask> maybeTask,
17 | Func> selector,
18 | TContext context)
19 | {
20 | Maybe maybe = await maybeTask;
21 | return maybe.Bind(selector, context);
22 | }
23 | }
24 | }
25 | #endif
26 |
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions/Maybe/Extensions/Bind.ValueTask.Right.cs:
--------------------------------------------------------------------------------
1 | #if NET5_0_OR_GREATER
2 | using System;
3 | using System.Threading.Tasks;
4 |
5 | namespace CSharpFunctionalExtensions.ValueTasks
6 | {
7 | public static partial class MaybeExtensions
8 | {
9 | public static ValueTask> Bind(this Maybe maybe, Func>> selector)
10 | {
11 | if (maybe.HasNoValue)
12 | return Maybe.None.AsCompletedValueTask();
13 |
14 | return selector(maybe.GetValueOrThrow());
15 | }
16 |
17 | public static ValueTask> Bind(
18 | this Maybe maybe,
19 | Func>> selector,
20 | TContext context)
21 | {
22 | if (maybe.HasNoValue)
23 | return Maybe.None.AsCompletedValueTask();
24 |
25 | return selector(maybe.GetValueOrThrow(), context);
26 | }
27 | }
28 | }
29 | #endif
30 |
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions/Maybe/Extensions/Bind.ValueTask.cs:
--------------------------------------------------------------------------------
1 | #if NET5_0_OR_GREATER
2 | using System;
3 | using System.Threading.Tasks;
4 |
5 | namespace CSharpFunctionalExtensions.ValueTasks
6 | {
7 | public static partial class MaybeExtensions
8 | {
9 | public static async ValueTask> Bind(this ValueTask> maybeTask, Func>> selector)
10 | {
11 | Maybe maybe = await maybeTask;
12 | return await maybe.Bind(selector);
13 | }
14 |
15 | public static async ValueTask> Bind(
16 | this ValueTask> maybeTask,
17 | Func>> selector,
18 | TContext context)
19 | {
20 | Maybe maybe = await maybeTask;
21 | return await maybe.Bind(selector, context);
22 | }
23 | }
24 | }
25 | #endif
26 |
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions/Maybe/Extensions/Bind.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace CSharpFunctionalExtensions
4 | {
5 | public static partial class MaybeExtensions
6 | {
7 | public static Maybe Bind(in this Maybe maybe, Func> selector)
8 | {
9 | if (maybe.HasNoValue)
10 | return Maybe.None;
11 |
12 | return selector(maybe.GetValueOrThrow());
13 | }
14 |
15 | public static Maybe Bind(
16 | in this Maybe maybe,
17 | Func> selector,
18 | TContext context
19 | )
20 | {
21 | if (maybe.HasNoValue)
22 | return Maybe.None;
23 |
24 | return selector(maybe.GetValueOrThrow(), context);
25 | }
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions/Maybe/Extensions/BindOptional.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace CSharpFunctionalExtensions
4 | {
5 | public static partial class MaybeExtensions
6 | {
7 | ///
8 | /// Convert an optional value into a Result. The result, being optional, is of type Maybe.
9 | ///
10 | public static Result, TError> BindOptional(
11 | this Maybe maybe,
12 | Func> bind)
13 | {
14 | return maybe.Bind(v => Maybe.From(bind(v))).Optional();
15 | }
16 |
17 | ///
18 | /// Convert an optional value into a Result. The result, being optional, is of type Maybe.
19 | ///
20 | public static Result> BindOptional(
21 | this Maybe maybe,
22 | Func> bind)
23 | {
24 | return maybe.Bind(v => Maybe.From(bind(v))).Optional();
25 | }
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/CSharpFunctionalExtensions/Maybe/Extensions/Choose.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 |
4 | namespace CSharpFunctionalExtensions
5 | {
6 | public static partial class MaybeExtensions
7 | {
8 | public static IEnumerable Choose(this IEnumerable> source, Func selector)
9 | {
10 | using (var enumerator = source.GetEnumerator())
11 | {
12 | while (enumerator.MoveNext())
13 | {
14 | var item = enumerator.Current;
15 | if (item.HasValue) yield return selector(item.GetValueOrThrow());
16 | }
17 | }
18 | }
19 |
20 | public static IEnumerable