// Copyright Epic Games, Inc. All Rights Reserved.
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using StackExchange.Redis;
namespace EpicGames.Redis
{
///
/// Represents a typed Redis sorted set with a given key
///
public record struct RedisSortedSet(IDatabaseAsync Database, RedisSortedSetKey Key);
///
/// Extension methods for sets
///
public static class RedisSortedSetExtensions
{
#region Conditions
///
public static Condition SortedSetContains(this RedisSortedSet target, TElement value)
=> target.Key.SortedSetContains(value);
///
public static Condition SortedSetEqual(this RedisSortedSet target, TElement value, RedisValue score)
=> target.Key.SortedSetEqual(value, score);
///
public static Condition SortedSetLengthEqual(this RedisSortedSet target, long length)
=> target.Key.SortedSetLengthLessThan(length);
///
public static Condition SortedSetLengthGreaterThan(this RedisSortedSet target, long length)
=> target.Key.SortedSetLengthGreaterThan(length);
///
public static Condition SortedSetLengthLessThan(this RedisSortedSet target, long length)
=> target.Key.SortedSetLengthLessThan(length);
///
public static Condition SortedSetNotContains(this RedisSortedSet target, TElement value)
=> target.Key.SortedSetNotContains(value);
///
public static Condition SortedSetNotEqual(this RedisSortedSet target, TElement value, RedisValue score)
=> target.Key.SortedSetNotEqual(value, score);
///
public static Condition SortedSetScoreExists(this RedisSortedSet target, RedisValue score)
=> target.Key.SortedSetScoreExists(score);
///
public static Condition SortedSetScoreExists(this RedisSortedSet target, RedisValue score, RedisValue count)
=> target.Key.SortedSetScoreExists(score, count);
#endregion
#region SortedSetAddAsync
///
public static Task AddAsync(this RedisSortedSet target, TElement value, double score, SortedSetWhen when = SortedSetWhen.Always, CommandFlags flags = CommandFlags.None)
=> target.Database.SortedSetAddAsync(target.Key, value, score, when, flags);
///
public static Task AddAsync(this RedisSortedSet target, SortedSetEntry[] values, SortedSetWhen when = SortedSetWhen.Always, CommandFlags flags = CommandFlags.None)
=> target.Database.SortedSetAddAsync(target.Key, values, when, flags);
#endregion
#region SortedSetLengthAsync
///
public static Task LengthAsync(this RedisSortedSet target, double min = Double.NegativeInfinity, double max = Double.PositiveInfinity, Exclude exclude = Exclude.None, CommandFlags flags = CommandFlags.None)
=> target.Database.SortedSetLengthAsync(target.Key, min, max, exclude, flags);
#endregion
#region SortedSetLengthByValueAsync
///
public static Task LengthByValueAsync(this RedisSortedSet target, TElement min, TElement max, Exclude exclude = Exclude.None, CommandFlags flags = CommandFlags.None)
=> target.Database.SortedSetLengthByValueAsync(target.Key, min, max, exclude, flags);
#endregion
#region SortedSetRangeByRankAsync
///
public static Task RangeByRankAsync(this RedisSortedSet target, long start = 0, long stop = -1, Order order = Order.Ascending, CommandFlags flags = CommandFlags.None)
=> target.Database.SortedSetRangeByRankAsync(target.Key, start, stop, order, flags);
#endregion
#region SortedSetRangeByRankWithScoresAsync
///
public static Task[]> RangeByRankWithScoresAsync(this RedisSortedSet target, long start, long stop = -1, Order order = Order.Ascending, CommandFlags flags = CommandFlags.None)
=> target.Database.SortedSetRangeByRankWithScoresAsync(target.Key, start, stop, order, flags);
#endregion
#region SortedSetRangeByScoreAsync
///
public static Task RangeByScoreAsync(this RedisSortedSet target, double start = Double.NegativeInfinity, double stop = Double.PositiveInfinity, Exclude exclude = Exclude.None, Order order = Order.Ascending, long skip = 0L, long take = -1L, CommandFlags flags = CommandFlags.None)
=> target.Database.SortedSetRangeByScoreAsync(target.Key, start, stop, exclude, order, skip, take, flags);
#endregion
#region SortedSetRangeByScoreWithScoresAsync
///
public static Task[]> SortedSetRangeByScoreWithScoresAsync(this RedisSortedSet target, double start = Double.NegativeInfinity, double stop = Double.PositiveInfinity, Exclude exclude = Exclude.None, Order order = Order.Ascending, long skip = 0L, long take = -1L, CommandFlags flags = CommandFlags.None)
=> target.Database.SortedSetRangeByScoreWithScoresAsync(target.Key, start, stop, exclude, order, skip, take, flags);
#endregion
#region SortedSetRangeByValueAsync
///
public static Task RangeByValueAsync(this RedisSortedSet target, TElement min, TElement max, Exclude exclude = Exclude.None, Order order = Order.Ascending, long skip = 0L, long take = -1L, CommandFlags flags = CommandFlags.None)
=> target.Database.SortedSetRangeByValueAsync(target.Key, min, max, exclude, order, skip, take, flags);
#endregion
#region SortedSetRankAsync
///
public static Task RankAsync(this RedisSortedSet target, TElement item, Order order = Order.Ascending, CommandFlags flags = CommandFlags.None)
=> target.Database.SortedSetRankAsync(target.Key, item, order, flags);
#endregion
#region SortedSetRemoveAsync
///
public static Task RemoveAsync(this RedisSortedSet target, TElement value, CommandFlags flags = CommandFlags.None)
=> target.Database.SortedSetRemoveAsync(target.Key, value, flags);
///
public static Task RemoveAsync(this RedisSortedSet target, TElement[] values, CommandFlags flags = CommandFlags.None)
=> target.Database.SortedSetRemoveAsync(target.Key, values, flags);
#endregion
#region SortedSetRemoveRangeByRankAsync
///
public static Task RemoveRangeByRankAsync(this RedisSortedSet target, long start, long stop, CommandFlags flags = CommandFlags.None)
=> target.Database.SortedSetRemoveRangeByRankAsync(target.Key, start, stop, flags);
#endregion
#region SortedSetRemoveRangeByScoreAsync
///
public static Task RemoveRangeByScoreAsync(this RedisSortedSet target, double start, double stop, Exclude exclude = Exclude.None, CommandFlags flags = CommandFlags.None)
=> target.Database.SortedSetRemoveRangeByScoreAsync(target.Key, start, stop, exclude, flags);
#endregion
#region SortedSetRemoveRangeByValueAsync
///
public static Task RemoveRangeByValueAsync(this RedisSortedSet target, TElement min, TElement max, Exclude exclude = Exclude.None, CommandFlags flags = CommandFlags.None)
=> target.Database.SortedSetRemoveRangeByValueAsync(target.Key, min, max, exclude, flags);
#endregion
#region SortedSetScanAsync
///
public static IAsyncEnumerable> ScanAsync(this RedisSortedSet target, RedisValue pattern = default, int pageSize = 250, long cursor = 0, int pageOffset = 0, CommandFlags flags = CommandFlags.None)
=> target.Database.SortedSetScanAsync(target.Key, pattern, pageSize, cursor, pageOffset, flags);
#endregion
#region SortedSetScoreAsync
///
public static Task ScoreAsync(this RedisSortedSet target, TElement member, CommandFlags flags = CommandFlags.None)
=> target.Database.SortedSetScoreAsync(target.Key, member, flags);
#endregion
#region SortedSetUpdateAsync
///
public static Task UpdateAsync(this RedisSortedSet target, TElement member, double score, SortedSetWhen when = SortedSetWhen.Always, CommandFlags flags = CommandFlags.None)
=> target.Database.SortedSetUpdateAsync(target.Key, member, score, when, flags);
///
public static Task UpdateAsync(this RedisSortedSet target, SortedSetEntry[] values, SortedSetWhen when = SortedSetWhen.Always, CommandFlags flags = CommandFlags.None)
=> target.Database.SortedSetUpdateAsync(target.Key, values, when, flags);
#endregion
}
}