diff --git a/Src/Core/Optional/Optional.cs b/Src/Core/Optional/Optional.cs index b9f27cd..f0f24b3 100644 --- a/Src/Core/Optional/Optional.cs +++ b/Src/Core/Optional/Optional.cs @@ -1,4 +1,5 @@ using System; +using Cysharp.Threading.Tasks; namespace BITKit { @@ -70,6 +71,22 @@ namespace BITKit return Allow ? Value : other.Invoke(); } + public async UniTask IfNotAllowAsync(Func> func) + { + return Allow ? Value : await func.Invoke(); + } + + public async UniTask SetValueThenAllowAsync(Func> func) + { + if (Allow) + { + return value; + } + value = await func.Invoke(); + allow = true; + return value; + } + public void SetValueThenAllow(T newValue) { value = newValue; diff --git a/Src/Core/Wrapper/IWrapper.cs b/Src/Core/Wrapper/IWrapper.cs index 7c38bfe..abab98c 100644 --- a/Src/Core/Wrapper/IWrapper.cs +++ b/Src/Core/Wrapper/IWrapper.cs @@ -9,19 +9,37 @@ namespace BITKit } public interface IWrapper:IWrapper { + public Action OnValueChanged { get; set; } public T Value { get; set; } } public class ValueWrapper : IWrapper { - public T Value { get; set; }=default; - public object Obj { get => Value; set => Value = (T)value; } + public Action OnValueChanged { get; set; } + + public T Value + { + get => _value; + set + { + var prev = _value; + _value = value; + OnValueChanged?.Invoke(prev,value); + } + } + + private T _value = typeof(T) == typeof(string) ? string.Empty.As() : Activator.CreateInstance(); + public object Obj + { + get => Value; + set => Value = (T)value; + } } public class PropertyWrapper : IWrapper { private readonly PropertyInfo _field; private readonly object _target; - public event Action OnValueChanged; + public Action OnValueChanged { get; set; } public PropertyWrapper(PropertyInfo field, object target) { _field = field; @@ -40,8 +58,8 @@ namespace BITKit public object Obj { - get => _field.GetValue(_target); - set => _field.SetValue(_target, value); + get => Value; + set => Value = (T)value; } } public class FieldWrapper : IWrapper @@ -53,16 +71,23 @@ namespace BITKit _field = field; _target = target ?? throw new ArgumentNullException(nameof(target)); } + + public Action OnValueChanged { get; set; } + public T Value { get => (T)_field.GetValue(_target); - set => _field.SetValue(_target, value); + set + { + OnValueChanged?.Invoke(Value, value); + _field.SetValue(_target, value); + } } public object Obj { - get => _field.GetValue(_target); - set => _field.SetValue(_target, value); + get => Value; + set => Value = (T)value; } } public class FuncWrapper : IWrapper @@ -74,6 +99,9 @@ namespace BITKit _get = get; _set = set; } + + public Action OnValueChanged { get; set; } + public T Value { get => _get(); @@ -82,8 +110,8 @@ namespace BITKit public object Obj { - get => _get(); - set => _set((T)value); + get => Value; + set => Value = (T)value; } } }