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.
No new features will be added or bugs fixed unless requested through an issue.
If you wish to fork this repository and continue the work, you are very welcome
to do so.
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 missing
You 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 dictionary
TryFirst
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