A game about forced loneliness, made by TACStudios
1using System; 2using System.Collections.Generic; 3 4namespace Unity.VisualScripting 5{ 6 public class OverrideStack<T> 7 { 8 public OverrideStack(T defaultValue) 9 { 10 _value = defaultValue; 11 getValue = () => _value; 12 setValue = (value) => _value = value; 13 } 14 15 public OverrideStack(Func<T> getValue, Action<T> setValue) 16 { 17 Ensure.That(nameof(getValue)).IsNotNull(getValue); 18 Ensure.That(nameof(setValue)).IsNotNull(setValue); 19 20 this.getValue = getValue; 21 this.setValue = setValue; 22 } 23 24 public OverrideStack(Func<T> getValue, Action<T> setValue, Action clearValue) : this(getValue, setValue) 25 { 26 Ensure.That(nameof(clearValue)).IsNotNull(clearValue); 27 28 this.clearValue = clearValue; 29 } 30 31 private readonly Func<T> getValue; 32 33 private readonly Action<T> setValue; 34 35 private readonly Action clearValue; 36 37 private T _value; 38 39 private readonly Stack<T> previous = new Stack<T>(); 40 41 public T value 42 { 43 get 44 { 45 return getValue(); 46 } 47 internal set 48 { 49 setValue(value); 50 } 51 } 52 53 public OverrideLayer<T> Override(T item) 54 { 55 return new OverrideLayer<T>(this, item); 56 } 57 58 public void BeginOverride(T item) 59 { 60 previous.Push(value); 61 value = item; 62 } 63 64 public void EndOverride() 65 { 66 if (previous.Count == 0) 67 { 68 throw new InvalidOperationException(); 69 } 70 71 value = previous.Pop(); 72 73 if (previous.Count == 0) 74 { 75 clearValue?.Invoke(); 76 } 77 } 78 79 public static implicit operator T(OverrideStack<T> stack) 80 { 81 Ensure.That(nameof(stack)).IsNotNull(stack); 82 83 return stack.value; 84 } 85 } 86 87 public struct OverrideLayer<T> : IDisposable 88 { 89 public OverrideStack<T> stack { get; } 90 91 internal OverrideLayer(OverrideStack<T> stack, T item) 92 { 93 Ensure.That(nameof(stack)).IsNotNull(stack); 94 95 this.stack = stack; 96 97 stack.BeginOverride(item); 98 } 99 100 public void Dispose() 101 { 102 stack.EndOverride(); 103 } 104 } 105}