mirror of
https://gitlab.com/Kwoth/nadekobot.git
synced 2024-10-02 20:13:13 +00:00
IPubSub subs will now use valuetask, as almost no subscriptions actually await anything
This commit is contained in:
parent
de3d9ecbe3
commit
0ec70646f8
6 changed files with 33 additions and 29 deletions
|
@ -17,7 +17,7 @@ namespace Nadeko.Tests
|
|||
{
|
||||
Assert.AreEqual(expected, data);
|
||||
Assert.Pass();
|
||||
return Task.CompletedTask;
|
||||
return default;
|
||||
});
|
||||
await pubsub.Pub(key, expected);
|
||||
Assert.Fail("Event not registered");
|
||||
|
@ -33,9 +33,9 @@ namespace Nadeko.Tests
|
|||
{
|
||||
Assert.AreEqual(expected, data);
|
||||
Assert.Pass();
|
||||
return Task.CompletedTask;
|
||||
return default;
|
||||
});
|
||||
await pubsub.Unsub(key, _ => Task.CompletedTask);
|
||||
await pubsub.Unsub(key, _ => default);
|
||||
await pubsub.Pub(key, expected);
|
||||
Assert.Fail("Event not registered");
|
||||
}
|
||||
|
@ -50,13 +50,13 @@ namespace Nadeko.Tests
|
|||
{
|
||||
Assert.AreEqual(expected, data);
|
||||
Assert.Pass();
|
||||
return Task.CompletedTask;
|
||||
return default;
|
||||
});
|
||||
await pubsub.Unsub(key, data =>
|
||||
{
|
||||
Assert.AreEqual(expected, data);
|
||||
Assert.Pass();
|
||||
return Task.CompletedTask;
|
||||
return default;
|
||||
});
|
||||
await pubsub.Pub(key, expected);
|
||||
Assert.Fail("Event not registered");
|
||||
|
@ -68,10 +68,10 @@ namespace Nadeko.Tests
|
|||
TypedKey<int> key = "test_key";
|
||||
var pubsub = new EventPubSub();
|
||||
|
||||
Task Action(int data)
|
||||
ValueTask Action(int data)
|
||||
{
|
||||
Assert.Fail("Event is raised when it shouldn't be");
|
||||
return Task.CompletedTask;
|
||||
return default;
|
||||
}
|
||||
|
||||
await pubsub.Sub(key, Action);
|
||||
|
@ -88,11 +88,11 @@ namespace Nadeko.Tests
|
|||
|
||||
var localData = new byte[1];
|
||||
|
||||
Task Action(byte[] data)
|
||||
ValueTask Action(byte[] data)
|
||||
{
|
||||
Assert.AreEqual(localData, data);
|
||||
Assert.Pass();
|
||||
return Task.CompletedTask;
|
||||
return default;
|
||||
}
|
||||
|
||||
await pubsub.Sub(key, Action);
|
||||
|
@ -110,18 +110,18 @@ namespace Nadeko.Tests
|
|||
var localData = new object();
|
||||
int successCounter = 0;
|
||||
|
||||
Task Action1(object data)
|
||||
ValueTask Action1(object data)
|
||||
{
|
||||
Assert.AreEqual(localData, data);
|
||||
successCounter+=10;
|
||||
return Task.CompletedTask;
|
||||
return default;
|
||||
}
|
||||
|
||||
Task Action2(object data)
|
||||
ValueTask Action2(object data)
|
||||
{
|
||||
Assert.AreEqual(localData, data);
|
||||
successCounter++;
|
||||
return Task.CompletedTask;
|
||||
return default;
|
||||
}
|
||||
|
||||
await pubsub.Sub(key, Action1); // + 10 \
|
||||
|
|
|
@ -7,26 +7,26 @@ namespace NadekoBot.Core.Common
|
|||
{
|
||||
public class EventPubSub : IPubSub
|
||||
{
|
||||
private readonly Dictionary<string, Dictionary<Delegate, List<Func<object, Task>>>> _actions
|
||||
= new Dictionary<string, Dictionary<Delegate, List<Func<object, Task>>>>();
|
||||
private readonly Dictionary<string, Dictionary<Delegate, List<Func<object, ValueTask>>>> _actions
|
||||
= new Dictionary<string, Dictionary<Delegate, List<Func<object, ValueTask>>>>();
|
||||
private readonly object locker = new object();
|
||||
|
||||
public Task Sub<TData>(in TypedKey<TData> key, Func<TData, Task> action)
|
||||
public Task Sub<TData>(in TypedKey<TData> key, Func<TData, ValueTask> action)
|
||||
{
|
||||
Func<object, Task> localAction = obj => action((TData) obj);
|
||||
Func<object, ValueTask> localAction = obj => action((TData) obj);
|
||||
lock(locker)
|
||||
{
|
||||
Dictionary<Delegate, List<Func<object, Task>>> keyActions;
|
||||
Dictionary<Delegate, List<Func<object, ValueTask>>> keyActions;
|
||||
if (!_actions.TryGetValue(key.Key, out keyActions))
|
||||
{
|
||||
keyActions = new Dictionary<Delegate, List<Func<object, Task>>>();
|
||||
keyActions = new Dictionary<Delegate, List<Func<object, ValueTask>>>();
|
||||
_actions[key.Key] = keyActions;
|
||||
}
|
||||
|
||||
List<Func<object, Task>> sameActions;
|
||||
List<Func<object, ValueTask>> sameActions;
|
||||
if (!keyActions.TryGetValue(action, out sameActions))
|
||||
{
|
||||
sameActions = new List<Func<object, Task>>();
|
||||
sameActions = new List<Func<object, ValueTask>>();
|
||||
keyActions[action] = sameActions;
|
||||
}
|
||||
|
||||
|
@ -42,16 +42,19 @@ namespace NadekoBot.Core.Common
|
|||
{
|
||||
if(_actions.TryGetValue(key.Key, out var actions))
|
||||
{
|
||||
// if this class ever gets used, this needs to be properly implemented
|
||||
// 1. ignore all valuetasks which are completed
|
||||
// 2. return task.whenall all other tasks
|
||||
return Task.WhenAll(actions
|
||||
.SelectMany(kvp => kvp.Value)
|
||||
.Select(action => action(data)));
|
||||
.Select(action => action(data).AsTask()));
|
||||
}
|
||||
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
}
|
||||
|
||||
public Task Unsub<TData>(in TypedKey<TData> key, Func<TData, Task> action)
|
||||
public Task Unsub<TData>(in TypedKey<TData> key, Func<TData, ValueTask> action)
|
||||
{
|
||||
lock (locker)
|
||||
{
|
||||
|
@ -88,4 +91,5 @@ namespace NadekoBot.Core.Common
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -6,6 +6,6 @@ namespace NadekoBot.Core.Common
|
|||
public interface IPubSub
|
||||
{
|
||||
public Task Pub<TData>(in TypedKey<TData> key, TData data);
|
||||
public Task Sub<TData>(in TypedKey<TData> key, Func<TData, Task> action);
|
||||
public Task Sub<TData>(in TypedKey<TData> key, Func<TData, ValueTask> action);
|
||||
}
|
||||
}
|
|
@ -28,7 +28,7 @@ namespace NadekoBot.Core.Common
|
|||
return _multi.GetSubscriber().PublishAsync($"{_creds.RedisKey()}:{key.Key}", serialized, CommandFlags.FireAndForget);
|
||||
}
|
||||
|
||||
public Task Sub<TData>(in TypedKey<TData> key, Func<TData, Task> action)
|
||||
public Task Sub<TData>(in TypedKey<TData> key, Func<TData, ValueTask> action)
|
||||
{
|
||||
var eventName = key.Key;
|
||||
return _multi.GetSubscriber().SubscribeAsync($"{_creds.RedisKey()}:{eventName}", async (ch, data) =>
|
||||
|
|
|
@ -30,10 +30,10 @@ namespace NadekoBot.Modules.Permissions.Services
|
|||
_pubSub.Sub(blPubKey, OnReload);
|
||||
}
|
||||
|
||||
private Task OnReload(BlacklistEntry[] blacklist)
|
||||
private ValueTask OnReload(BlacklistEntry[] blacklist)
|
||||
{
|
||||
_blacklist = blacklist;
|
||||
return Task.CompletedTask;
|
||||
return default;
|
||||
}
|
||||
|
||||
public async Task<bool> RunBehavior(DiscordSocketClient _, IGuild guild, IUserMessage usrMsg)
|
||||
|
|
|
@ -52,11 +52,11 @@ namespace NadekoBot.Core.Services
|
|||
_pubSub.Pub(_changeKey, _data);
|
||||
}
|
||||
|
||||
private Task OnChangePublished(TSettings newData)
|
||||
private ValueTask OnChangePublished(TSettings newData)
|
||||
{
|
||||
_data = newData;
|
||||
OnStateUpdate();
|
||||
return Task.CompletedTask;
|
||||
return default;
|
||||
}
|
||||
|
||||
private TSettings CreateCopy()
|
||||
|
|
Loading…
Reference in a new issue