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}