A C# library that mimics F#'s optionals
$ dotnet add package ComradeVanti.CSharpTools.Opt
A C# library that mimics F#'s optionals. Since the functionality and in most
cases even the method names are directly taken from F#, go check
out the documentation there
for details.
Methods for creating optionals are located on the Opt class. Methods
like Map or Bind are available as extension methods on IOpt instances for
easy chaining.
IOpt are immutable reference-types. Comparing them with Equals will be true
if the both contain a value and those values are equal. Comparing IOpt
with == will compare them using reference equality.
IOpt implements IEnumerable and supports Linq extensions such
as Contains, Count, Any and ToArray as well as use in foreach
statements.
Some Creates a present optionalNone Creates a missing optionalFromNullable Creates an optional from a nullable, which will be missing if
the given value is nullFromOp Creates an optional from an operation that might fail (throw an
exception)IsSome Checks if the optional is presentIsNone Checks if the optional is missingGet Attempts to get the value from the optional and throws an exception if
the value is missingDefaultValue Gets the value from this optional or a replacement if it is
missingMap Maps an optional from one type to another using a mapping-functionBind Maps an optional from one type to another using a mapping-function
which itself produces an optionalMatch Executes either a onSome or onNone action depending on if the optional
is presentIter Executes the given action if the optional is present, passing in the
contained valueDefaultWith Gets the value or the result of the replacement-function if it
is missingFilter Filters the optional with a predicateFlatten Collapses a nested optional into a flat oneFold/FoldBack Executes a folder-function with the value if presentForAll Checks if the value in the optional satisfies a predicate. Returns
true if the optional is missingYou can
use C# pattern-matching
on IOpt instances to check if they have a value or not.
For example:
switch (x) // Where x is an IOpt<int>
{
case ISome<int> { Value: var value}: // value is an int
break;
case INone<int> :
break;
}
Opt also includes some utility extensions for existing types
TryGet Attempts to get a value from the dictionaryTryFirst Attempts to get the first element from the sequenceTryLast Attempts to get the last element from the sequenceTryElementAt Attempts to get an element from the sequence by its indexChoose Selects and maps all items in the sequence where the given choose
function returned someTryFind Attempts to get the first item in the sequence for which the given
predicate holdsTryFindBack Attempts to get the last item in the sequence for which the
given predicate holdsCollect Collects a sequence of optionalsTrySingle Attempts to get the only item in this collectionFilterSome Filters out any missing values and returns only the present onesTryMax Attempts to get the maximum element from the collectionTryMin Attempts to get the minimum element from the collectionTryMaxBy Attempts to get the maximum element from the collection according
to a selector functionTryMinBy Attempts to get the minimum element from the collection according
to a selector function