This project provides a Maybe<T>
struct
which can be used to help clarify and handle cases when methods may return no value instead of returning null
.
This blog post explains the motivations for why you would use it.
These examples assume that you have an Account
class and a repository
for finding and saving accounts.
Creating maybes
var some = Maybe<Account>.Some(new Account());
var none = Maybe<Account>.None;
var someOther = account.ToMaybe(); // will be some or none depending on whether the account was null.
Checking if the maybe has value
var foundAccount = maybeAccount.HasValue;
Getting the value from a maybe
var account = maybeAccount.ValueOrDefault(new Account());
var account = maybeAccount.ValueOrThrow(new Exception("No account was found"));
Performing an action if there is a value
var maybeAccount = repository.Find(accountId);
maybeAccount.IfSome(account =>
{
account.LastUpdated = DateTimeOffset.UtcNow;
repository.Save(account);
});
Handle the cases where there is some value or there is none
var name = maybeAccount.Case(
some: account => account.FirstName,
none: () => "Anonymous");
Map a maybe to another type
Maybe<string> maybeFirstName = maybeAccount.Map(account => account.FirstName);
Maybe<IList<string>> emails = maybeAccount.Map(account => repository.GetEmailAddresses(account));