Updated common abstractions

This commit is contained in:
Toastie 2024-06-26 17:59:28 +12:00
parent 4fe4c4eff2
commit b045015efb
Signed by: toastie_t0ast
GPG key ID: 27F3B6855AFD40A4
23 changed files with 47 additions and 51 deletions

View file

@ -1,4 +1,4 @@
using OneOf;
using OneOf;
using OneOf.Types;
namespace Ellie.Common;
@ -13,7 +13,7 @@ public static class BotCacheExtensions
return default;
}
private static TypedKey<byte[]> GetImgKey(Uri uri)
=> new($"image:{uri}");

View file

@ -15,7 +15,7 @@ public interface IBotCache
/// <typeparam name="T">Type of the value</typeparam>
/// <returns>Returns whether add was sucessful. Always true unless ovewrite = false</returns>
ValueTask<bool> AddAsync<T>(TypedKey<T> key, T value, TimeSpan? expiry = null, bool overwrite = true);
/// <summary>
/// Get an element from the cache
/// </summary>
@ -23,7 +23,7 @@ public interface IBotCache
/// <typeparam name="T">Type of the value</typeparam>
/// <returns>Either a value or <see cref="None"/></returns>
ValueTask<OneOf<T, None>> GetAsync<T>(TypedKey<T> key);
/// <summary>
/// Remove a key from the cache
/// </summary>

View file

@ -26,12 +26,12 @@ public sealed class MemoryBotCache : IBotCache
item.AbsoluteExpirationRelativeToNow = expiry;
return new(true);
}
lock (_cacheLock)
{
if (_cache.TryGetValue(key.Key, out var old) && old is not null)
return new(false);
using var item = _cache.CreateEntry(key.Key);
item.Value = value;
item.AbsoluteExpirationRelativeToNow = expiry;
@ -63,7 +63,7 @@ public sealed class MemoryBotCache : IBotCache
{
lock (_cacheLock)
{
var toReturn = _cache.TryGetValue(key.Key, out var old) && old is not null;
var toReturn = _cache.TryGetValue(key.Key, out var old ) && old is not null;
_cache.Remove(key.Key);
return new(toReturn);
}

View file

@ -1,4 +1,4 @@
using System.Diagnostics;
using System.Diagnostics;
namespace System.Collections.Generic;
@ -6,7 +6,7 @@ namespace System.Collections.Generic;
public sealed class ConcurrentHashSet<T> : IReadOnlyCollection<T>, ICollection<T> where T : notnull
{
private readonly ConcurrentDictionary<T, bool> _backingStore;
public ConcurrentHashSet()
=> _backingStore = new();
@ -46,12 +46,8 @@ public sealed class ConcurrentHashSet<T> : IReadOnlyCollection<T>, ICollection<T
public void CopyTo(T[] array, int arrayIndex)
{
ArgumentNullException.ThrowIfNull(array);
if (arrayIndex < 0)
throw new ArgumentOutOfRangeException(nameof(arrayIndex));
if (arrayIndex >= array.Length)
throw new ArgumentOutOfRangeException(nameof(arrayIndex));
ArgumentOutOfRangeException.ThrowIfNegative(arrayIndex);
ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual(arrayIndex, array.Length);
CopyToInternal(array, arrayIndex);
}
@ -63,7 +59,7 @@ public sealed class ConcurrentHashSet<T> : IReadOnlyCollection<T>, ICollection<T
{
if (arrayIndex >= len)
throw new IndexOutOfRangeException(nameof(arrayIndex));
array[arrayIndex++] = k;
}
}

View file

@ -1,4 +1,4 @@
using System.Collections;
using System.Collections;
namespace Ellie.Common;

View file

@ -16,7 +16,7 @@ public sealed class EllieRandom : Random
_rng.GetBytes(bytes);
return Math.Abs(BitConverter.ToInt32(bytes, 0));
}
/// <summary>
/// Generates a random integer between 0 (inclusive) and
/// a specified exclusive upper bound using a cryptographically strong random number generator.

View file

@ -1,4 +1,4 @@
using System.Security.Cryptography;
using System.Security.Cryptography;
namespace Ellie.Common;
@ -43,7 +43,7 @@ public static class ArrayExtensions
public static TOut[] Map<TIn, TOut>(this IReadOnlyCollection<TIn> col, Func<TIn, TOut> f)
{
var toReturn = new TOut[col.Count];
var i = 0;
foreach (var item in col)
toReturn[i++] = f(item);

View file

@ -1,4 +1,4 @@
using System.Security.Cryptography;
using System.Security.Cryptography;
namespace Ellie.Common;
@ -37,7 +37,7 @@ public static class EnumerableExtensions
/// </returns>
public static string Join<T>(this IEnumerable<T> data, string separator, Func<T, string>? func = null)
=> string.Join(separator, data.Select(func ?? (x => x?.ToString() ?? string.Empty)));
/// <summary>
/// Randomize element order by performing the Fisher-Yates shuffle
/// </summary>

View file

@ -1,4 +1,4 @@
namespace Ellie.Common;
namespace Ellie.Common;
public static class Extensions
{

View file

@ -7,16 +7,16 @@ public static class PipeExtensions
{
public static TOut Pipe<TIn, TOut>(this TIn a, Func<TIn, TOut> fn)
=> fn(a);
public static TOut Pipe<TIn, TOut>(this TIn a, PipeFunc<TIn, TOut> fn)
=> fn(a);
public static TOut Pipe<TIn1, TIn2, TOut>(this (TIn1, TIn2) a, PipeFunc<TIn1, TIn2, TOut> fn)
=> fn(a.Item1, a.Item2);
public static (TIn, TExtra) With<TIn, TExtra>(this TIn a, TExtra b)
=> (a, b);
public static async Task<TOut> Pipe<TIn, TOut>(this Task<TIn> a, Func<TIn, TOut> fn)
=> fn(await a);
}

View file

@ -1,4 +1,4 @@
using EllieBot.Common.Yml;
using EllieBot.Common.Yml;
using System.Text;
using System.Text.RegularExpressions;
@ -82,14 +82,14 @@ public static class StringExtensions
// Step 3
for (var i = 1; i <= n; i++)
//Step 4
for (var j = 1; j <= m; j++)
{
// Step 5
var cost = t[j - 1] == s[i - 1] ? 0 : 1;
for (var j = 1; j <= m; j++)
{
// Step 5
var cost = t[j - 1] == s[i - 1] ? 0 : 1;
// Step 6
d[i, j] = Math.Min(Math.Min(d[i - 1, j] + 1, d[i, j - 1] + 1), d[i - 1, j - 1] + cost);
}
// Step 6
d[i, j] = Math.Min(Math.Min(d[i - 1, j] + 1, d[i, j - 1] + 1), d[i - 1, j - 1] + cost);
}
// Step 7
return d[n, m];

View file

@ -1,4 +1,4 @@
namespace Ellie.Common;
namespace Ellie.Common;
public static class StandardConversions
{

View file

@ -50,9 +50,9 @@ public class EventPubSub : IPubSub
{
// get subscriptions for this action
if (_actions.TryGetValue(key.Key, out var actions))
// get subscriptions which have the same action hash code
// note: having this as a list allows for multiple subscriptions of
// the same insance's/static method
// get subscriptions which have the same action hash code
// note: having this as a list allows for multiple subscriptions of
// the same insance's/static method
{
if (actions.TryGetValue(action, out var sameActions))
{

View file

@ -1,4 +1,4 @@
namespace Ellie.Common;
namespace Ellie.Common;
public interface IPubSub
{

View file

@ -1,4 +1,4 @@
namespace Ellie.Common;
namespace Ellie.Common;
public interface ISeria
{

View file

@ -37,7 +37,7 @@ public sealed class QueueRunner
while (true)
{
var func = await _channel.Reader.ReadAsync(cancel);
try
{
await func();
@ -55,7 +55,7 @@ public sealed class QueueRunner
}
}
}
public ValueTask EnqueueAsync(Func<Task> action)
=> _channel.Writer.WriteAsync(action);
}

View file

@ -1,4 +1,4 @@
namespace Ellie.Common;
namespace Ellie.Common;
public readonly struct TypedKey<TData>
{

View file

@ -1,11 +1,12 @@
#nullable disable
#nullable disable
namespace EllieBot;
public interface IBotCredentials
{
string Token { get; }
string GoogleApiKey { get; }
string EllieAiToken { get; }
ICollection<ulong> OwnerIds { get; set; }
string GoogleApiKey { get; }
bool UsePrivilegedIntents { get; }
string RapidApiKey { get; }

View file

@ -20,7 +20,7 @@ public sealed record class CommandStrings
[YamlMember(Alias = "ex")]
public string[] Examples { get; set; }
[YamlMember(Alias = "params")]
public Dictionary<string, CommandStringParam>[] Params { get; set; }
}
@ -29,7 +29,7 @@ public sealed record class CommandStringParam
{
// [YamlMember(Alias = "type", ScalarStyle = ScalarStyle.DoubleQuoted)]
// public string Type { get; set; }
[YamlMember(Alias = "desc", ScalarStyle = ScalarStyle.DoubleQuoted)]
public string Desc { get; set; }
}

View file

@ -1,4 +1,4 @@
#nullable disable
#nullable disable
using System.Globalization;
namespace EllieBot.Common;

View file

@ -8,7 +8,7 @@ public static class BotStringsExtensions
// this one is for pipe fun, see PipeExtensions.cs
public static string GetText(this IBotStrings strings, in LocStr str, in ulong guildId)
=> strings.GetText(str.Key, guildId, str.Params);
public static string GetText(this IBotStrings strings, in LocStr str, ulong? guildId = null)
=> strings.GetText(str.Key, guildId, str.Params);

View file

@ -1,4 +1,4 @@
#nullable disable
#nullable disable
namespace EllieBot.Services;
/// <summary>

View file

@ -1,5 +1,4 @@
#nullable disable
namespace EllieBot.Services;
/// <summary>