mirror of
https://github.com/Bragin-Stepan/project-entity.git
synced 2026-03-05 07:41:10 +00:00
init: add project
This commit is contained in:
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 38f811842f4c4882aca9f3ce32f0ab0c
|
||||
timeCreated: 1770231370
|
||||
@@ -0,0 +1,14 @@
|
||||
using System;
|
||||
|
||||
namespace _Project.Develop.Runtime.Utils.ReactiveManagement.Event
|
||||
{
|
||||
public interface IReadOnlyEvent
|
||||
{
|
||||
IDisposable Subscribe(Action action);
|
||||
}
|
||||
|
||||
public interface IReadOnlyEvent<T>
|
||||
{
|
||||
IDisposable Subscribe(Action<T> action);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 39a931a0bd494206bd9b8b1b4003a87e
|
||||
timeCreated: 1770231417
|
||||
@@ -0,0 +1,77 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace _Project.Develop.Runtime.Utils.ReactiveManagement.Event
|
||||
{
|
||||
public class ReactiveEvent<T> : IReadOnlyEvent<T>
|
||||
{
|
||||
private readonly List<Subscriber<T>> _subscribers = new();
|
||||
private readonly List<Subscriber<T>> _toAdd = new();
|
||||
private readonly List<Subscriber<T>> _toRemove = new();
|
||||
|
||||
public IDisposable Subscribe(Action<T> action)
|
||||
{
|
||||
Subscriber<T> subscriber = new Subscriber<T>(action, Remove);
|
||||
_toAdd.Add(subscriber);
|
||||
return subscriber;
|
||||
}
|
||||
|
||||
private void Remove(Subscriber<T> subscriber) => _toRemove.Add(subscriber);
|
||||
|
||||
public void Invoke(T arg)
|
||||
{
|
||||
if (_toAdd.Count > 0)
|
||||
{
|
||||
_subscribers.AddRange(_toAdd);
|
||||
_toAdd.Clear();
|
||||
}
|
||||
|
||||
if (_toRemove.Count > 0)
|
||||
{
|
||||
foreach (Subscriber<T> subscriber in _toRemove)
|
||||
_subscribers.Remove(subscriber);
|
||||
|
||||
_toRemove.Clear();
|
||||
}
|
||||
|
||||
foreach (Subscriber<T> subscriber in _subscribers)
|
||||
subscriber.Invoke(arg);
|
||||
}
|
||||
}
|
||||
|
||||
public class ReactiveEvent : IReadOnlyEvent
|
||||
{
|
||||
private readonly List<Subscriber> _subscribers = new();
|
||||
private readonly List<Subscriber> _toAdd = new();
|
||||
private readonly List<Subscriber> _toRemove = new();
|
||||
|
||||
public IDisposable Subscribe(Action action)
|
||||
{
|
||||
Subscriber subscriber = new Subscriber(action, Remove);
|
||||
_toAdd.Add(subscriber);
|
||||
return subscriber;
|
||||
}
|
||||
|
||||
private void Remove(Subscriber subscriber) => _toRemove.Add(subscriber);
|
||||
|
||||
public void Invoke()
|
||||
{
|
||||
if (_toAdd.Count > 0)
|
||||
{
|
||||
_subscribers.AddRange(_toAdd);
|
||||
_toAdd.Clear();
|
||||
}
|
||||
|
||||
if (_toRemove.Count > 0)
|
||||
{
|
||||
foreach (Subscriber subscriber in _toRemove)
|
||||
_subscribers.Remove(subscriber);
|
||||
|
||||
_toRemove.Clear();
|
||||
}
|
||||
|
||||
foreach (Subscriber subscriber in _subscribers)
|
||||
subscriber.Invoke();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3e72d59ed75643f287ae8c5fe58ce025
|
||||
timeCreated: 1770231387
|
||||
@@ -0,0 +1,52 @@
|
||||
using System;
|
||||
|
||||
namespace _Project.Develop.Runtime.Utils.ReactiveManagement
|
||||
{
|
||||
public class Subscriber : IDisposable
|
||||
{
|
||||
private Action _action;
|
||||
private Action<Subscriber> _onDispose;
|
||||
|
||||
public Subscriber(Action action, Action<Subscriber> onDispose)
|
||||
{
|
||||
_action = action;
|
||||
_onDispose = onDispose;
|
||||
}
|
||||
|
||||
public void Dispose() => _onDispose?.Invoke(this);
|
||||
|
||||
public void Invoke() => _action?.Invoke();
|
||||
}
|
||||
|
||||
public class Subscriber<T> : IDisposable
|
||||
{
|
||||
private Action<T> _action;
|
||||
private Action<Subscriber<T>> _onDispose;
|
||||
|
||||
public Subscriber(Action<T> action, Action<Subscriber<T>> onDispose)
|
||||
{
|
||||
_action = action;
|
||||
_onDispose = onDispose;
|
||||
}
|
||||
|
||||
public void Dispose() => _onDispose?.Invoke(this);
|
||||
|
||||
public void Invoke(T arg1) => _action?.Invoke(arg1);
|
||||
}
|
||||
|
||||
public class Subscriber<T, K> : IDisposable
|
||||
{
|
||||
private Action<T, K> _action;
|
||||
private Action<Subscriber<T, K>> _onDispose;
|
||||
|
||||
public Subscriber(Action<T, K> action, Action<Subscriber<T, K>> onDispose)
|
||||
{
|
||||
_action = action;
|
||||
_onDispose = onDispose;
|
||||
}
|
||||
|
||||
public void Dispose() => _onDispose?.Invoke(this);
|
||||
|
||||
public void Invoke(T arg1, K arg2) => _action?.Invoke(arg1, arg2);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c87e6c3df4794e418c2060eee1af2d14
|
||||
timeCreated: 1769098141
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f7c50257552f4cc693958eeda0f41c3d
|
||||
timeCreated: 1769097237
|
||||
@@ -0,0 +1,11 @@
|
||||
using System;
|
||||
|
||||
namespace _Project.Develop.Runtime.Utils.ReactiveManagement
|
||||
{
|
||||
public interface IReadOnlyVariable<T>
|
||||
{
|
||||
T Value { get; }
|
||||
|
||||
IDisposable Subscribe(Action<T, T> action);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: abc67e68747846d3aaf1474b04c77c1b
|
||||
timeCreated: 1769096939
|
||||
@@ -0,0 +1,61 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace _Project.Develop.Runtime.Utils.ReactiveManagement
|
||||
{
|
||||
public class ReactiveVariable<T> : IReadOnlyVariable<T> where T : IEquatable<T>
|
||||
{
|
||||
private readonly List<Subscriber<T, T>> _subscribers = new ();
|
||||
private readonly List<Subscriber<T, T>> _toAddList = new ();
|
||||
private readonly List<Subscriber<T, T>> _toRemoveList = new ();
|
||||
|
||||
public ReactiveVariable() => _value = default(T);
|
||||
|
||||
public ReactiveVariable(T value) => _value = value;
|
||||
|
||||
private T _value;
|
||||
|
||||
public T Value
|
||||
{
|
||||
get => _value;
|
||||
set
|
||||
{
|
||||
T oldValue = _value;
|
||||
_value = value;
|
||||
|
||||
if (_value.Equals(oldValue) == false)
|
||||
Invoke(oldValue, _value);
|
||||
}
|
||||
}
|
||||
|
||||
public IDisposable Subscribe(Action<T, T> action)
|
||||
{
|
||||
Subscriber<T, T> subscriber = new (action, RemoveSubscriber);
|
||||
_toAddList.Add(subscriber);
|
||||
|
||||
return subscriber;
|
||||
}
|
||||
|
||||
private void RemoveSubscriber(Subscriber<T, T> subscriber) => _toRemoveList.Add(subscriber);
|
||||
|
||||
private void Invoke(T oldValue, T newValue)
|
||||
{
|
||||
if(_toAddList.Count > 0)
|
||||
{
|
||||
_subscribers.AddRange(_toAddList);
|
||||
_toAddList.Clear();
|
||||
}
|
||||
|
||||
if(_toRemoveList.Count > 0)
|
||||
{
|
||||
foreach (Subscriber<T, T> subscriber in _toRemoveList)
|
||||
_subscribers.Remove(subscriber);
|
||||
|
||||
_toRemoveList.Clear();
|
||||
}
|
||||
|
||||
foreach (Subscriber<T, T> subscriber in _subscribers)
|
||||
subscriber.Invoke(oldValue, newValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 97e9e838b860437cabd97a319c2b6598
|
||||
timeCreated: 1769096939
|
||||
Reference in New Issue
Block a user