diff --git a/Assets/Escape Room Engine/Engine/Scripts/Utilities/Option.cs b/Assets/Escape Room Engine/Engine/Scripts/Utilities/Option.cs new file mode 100644 index 0000000..ed1061d --- /dev/null +++ b/Assets/Escape Room Engine/Engine/Scripts/Utilities/Option.cs @@ -0,0 +1,66 @@ +using System; + +namespace Escape_Room_Engine.Engine.Scripts.Utilities +{ + /// + /// Optional type with a subset of the functionality of the one described in the Rust documentation at https://doc.rust-lang.org/std/option/enum.Option.html. + /// + public interface IOption + { + public bool IsSome(); + public bool IsNone(); + public T Expect(string message); + public T Unwrap(); + public T UnwrapOr(T def); + public T UnwrapOrElse(Func f); + public IOption And(IOption other); + public IOption Or(IOption other); + public bool Contains(T value); + public T Match(Func some, Func none); + public void Match(Action some, Action none); + public void Match(Action some); + public void Match(Action none); + } + + public class Some : IOption + { + private readonly T _value; + + private Some(T value) => _value = value; + + public bool IsSome() => true; + public bool IsNone() => false; + public T Expect(string message) => _value; + public T Unwrap() => _value; + public T UnwrapOr(T def) => _value; + public T UnwrapOrElse(Func f) => _value; + public IOption And(IOption other) => other; + public IOption Or(IOption other) => this; + public bool Contains(T value) => _value.Equals(value); + public T Match(Func some, Func none) => some(_value); + public void Match(Action some, Action none) => some(_value); + public void Match(Action some) => some(_value); + public void Match(Action none) {} + + public static IOption Of(T value) => new Some(value); + } + + public class None : IOption + { + public bool IsSome() => false; + public bool IsNone() => true; + public T Expect(string message) => throw new Exception(message); + public T Unwrap() => throw new Exception("Tried to unwrap None."); + public T UnwrapOr(T def) => def; + public T UnwrapOrElse(Func f) => f(); + public IOption And(IOption other) => this; + public IOption Or(IOption other) => other; + public bool Contains(T value) => false; + public T Match(Func some, Func none) => none(); + public void Match(Action some, Action none) => none(); + public void Match(Action some) {} + public void Match(Action none) => none(); + + public static IOption New() => new None(); + } +} \ No newline at end of file diff --git a/Assets/Escape Room Engine/Engine/Scripts/Utilities/Option.cs.meta b/Assets/Escape Room Engine/Engine/Scripts/Utilities/Option.cs.meta new file mode 100644 index 0000000..778a8cc --- /dev/null +++ b/Assets/Escape Room Engine/Engine/Scripts/Utilities/Option.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 2782bb7baf73403a9cd9fc8cbc8d09a3 +timeCreated: 1668169918 \ No newline at end of file