Skip to content

Instantly share code, notes, and snippets.

public class Option<T>
{
public T Value { get; private set; }
public bool IsSome { get { return this != None; } }
public static readonly Option<T> None = new Option<T>(default(T));
public static Option<T> Some(T value)
{
return new Option<T>(value);
}
var name = Option<string>.Some("hello");
var noName = Option<string>.None;
[Fact]
public void MatchOptionSome()
{
var name = Option<string>.Some("hello");
var greeting = name.Match(
some: n => n,
none: () => "phew"
);
public TRes Match<TRes>(Func<T, TRes> some, Func<TRes> none)
{
if (IsSome)
return some.Invoke(Value);
else
return none.Invoke();
}
public void Match(Action<T> some, Action none)
{
public class Option<T> : IEnumerable<T>
{
public T Value { get; private set; }
public bool IsSome { get { return this != None; } }
public static readonly Option<T> None = new Option<T>(default(T));
public static Option<T> Some(T value)
{
return new Option<T>(value);
}
public static class OptionHelpers
{
public static Option<T> AsOption<T>(this IEnumerable<T> enu)
{
var val = enu.FirstOrDefault();
if (!enu.Any() || Equals(val, null))
return Option<T>.None;
else
return Option<T>.Some(val);
}
public IEnumerator<T> GetEnumerator()
{
if (IsSome)
yield return Value;
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
[Fact]
public void PassSomeThroughLinq()
{
var name = Option<string>.Some("christian");
var mangledName = name.Select(n => n + " " + n )
.Select(r => r.Replace('i', 'X'))
.Take(1)
.AsOption();
Assert.True(mangledName.IsSome);
public class Option<T>
{
public T Value { get; private set; }
public bool IsSome { get { return this != None; } }
public static readonly Option<T> None = new Option<T>(default(T));
public static Option<T> Some(T value)
{
return new Option<T>(value);
}
public static class OptionHelpers
{
public static TRes Match<T, TRes>(this Option<T> self, Func<T, TRes> some, Func<TRes> none)
{
if (self.IsSome)
return some.Invoke(self.Value);
else
return none.Invoke();
}