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