Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //直和を表現しきれない点を気にしたら負け
- public interface IOption<out T> : IEnumerable<T>
- {
- bool HasValue { get; }//== this.Any()
- }
- sealed public class Some<T> : IOption<T>
- {
- private readonly T val;
- public bool HasValue { get { return true; } }
- public Some(T v) {
- val = v;
- }
- public IEnumerator<T> GetEnumerator() {
- yield return val;
- }
- IEnumerator IEnumerable.GetEnumerator() {
- return this.GetEnumerator();
- }
- }
- sealed public class None<T> : IOption<T>
- {
- public bool HasValue { get { return false; } }
- public None() { }
- public IEnumerator<T> GetEnumerator() {
- yield break;
- }
- IEnumerator IEnumerable.GetEnumerator() {
- return this.GetEnumerator();
- }
- }
- static public class Option
- {
- static public Some<T> Some<T>(T v) {
- return new Some<T>(v);
- }
- static public None<T> None<T>() {
- return new None<T>();
- }
- static public IOption<T> Return<T>(T v) {
- if (v != null)
- return new Some<T>(v);
- else
- return new None<T>();
- }
- static public IOption<U> Bind<T, U>(this IOption<T> _, Func<T, IOption<U>> f) {
- return _.HasValue ?
- f(_.First()) :
- Option.None<U>();
- }
- static public IOption<T> ToOption<T>(this IEnumerable<T> _) {
- if (_.Any())
- return Option.Some<T>(_.First());
- else
- return Option.None<T>();
- }
- static public U Match<T, U>(this IOption<T> _, Func<T, U> Some, Func<U> None) {
- return _.HasValue ?
- Some(_.First()) :
- None();
- }
- static public void Match<T>(this IOption<T> _, Action<T> Some, Action None) {
- if (_.HasValue)
- Some(_.First());
- else
- None();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement