UniOption

Provides an implementation of the Option type for Unity. This is similar to the Option type from Rust, or the Maybe type from Haskell. Contains types Option<T> for reference types, and ValueOption<T> for value types.

Usage

Option<T> provides the following methods:

  • Some
  • None
  • Map
  • MapValue
  • MapObject
  • Reduce
  • Do
  • DoAsync (UniTask)
  • Where
  • WhereNot
  • OfType
  • Or
  • Match
  • ToEnumerable
  • Zip

ValueOption<T> is the same as Option<T>, but for value types. It provides the same methods, but instead of MapValue it is MapObject. Any type can be implicitly converted to an Option<T> or ValueOption<T>. null is converted to None, and any other value is converted to Some(value). Alternatively, Any reference or value type can be converted to an Option<T> or ValueOption<T> using the ToOption() and ToValueOption() extension methods.

Examples

Basics

// Create a new Option
Option<string> some = "Hello World";
Option<string> none = null;
ValueOption<int> someValue = 42;

//Perform operations on the options
some.Map(s => s.ToUpper())
    .Reduce("Default");
    .Do(s => Debug.Log(s))// Prints "HELLO WORLD"
    
none.Map(s => s.ToUpper())
    .Reduce("Default");
    .Do(s => Debug.Log(s))// Prints "Default"
    
someValue.Map(i => i * 2)
         .Reduce(0);
         .Do(i => Debug.Log(i))// Prints "84"
         
 //Async operations
some.Map(s => s.ToUpper())
    .DoAsync(async s => 
        {
            await UniTask.Delay(1000);
            Debug.Log(s);
        }).Forget();

Where/WhereNot

var stringOption = "TestString".ToOption()
                               .Where(s => s.Length > 5)
                               .WhereNot(s => s.Length > 15)
                               .Do(s => Debug.Log(s))// Prints "TestString"
                               
var intOption = 5.ToValueOption()
                 .Where(i => i >= 5)
                 .Do(i => Debug.Log(i))// Prints "5"               

OfType

var stringOption = "TestString".ToOption()
                               .OfType<string>()
                               .Do(s => Debug.Log(s))// Prints "TestString"

Or

string nullString = null;
var stringOption = nullString.ToOption()
                             .Or("Default")
                             .Do(s => Debug.Log(s))// Prints "Default"

Match

var option = "Hello World".ToOption();
var result = option.Match(some: s => s.ToUpper(),
                          none: () => "Default");

ToEnumerable

var stringOption = "TestString".ToOption();
        foreach (var s in stringOption.ToEnumerable()) {
            Debug.Log(s);// Prints "TestString"
        }

Zip

Returns a ValueOption<(T1,T2)> containing the result of the input function if both options are Some, or None if either option is None.

var stringOption = "TestString".ToOption()
                               .Zip(5);//Contains ValueTuple ("TestString", 5)

API References

API documentation can be found here.