diff --git a/Grayjay.Engine/Pagers/FilterPager.cs b/Grayjay.Engine/Pagers/FilterPager.cs new file mode 100644 index 0000000..c598d59 --- /dev/null +++ b/Grayjay.Engine/Pagers/FilterPager.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Grayjay.Engine.Pagers +{ + public class FilterPager : INestedPager, IPager + { + private readonly IPager _pager; + private readonly Func _filter; + + public string ID { get { return _pager.ID; } set { _pager.ID = value; } } + + public FilterPager(IPager pager, Func filter) + { + _pager = pager ?? throw new ArgumentNullException(nameof(pager)); + _filter = filter ?? throw new ArgumentNullException(nameof(filter)); + } + + public IPager FindPager(Func, bool> query) + { + if (query(_pager)) + return _pager; + else if (_pager is INestedPager) + return ((_pager as INestedPager) ?? throw new InvalidOperationException()).FindPager(query); + return null; + } + + public T[] GetResults() + { + return _pager.GetResults().Where(_filter).ToArray(); + } + + public bool HasMorePages() + { + return _pager.HasMorePages(); + } + + public void NextPage() + { + _pager.NextPage(); + } + } +} diff --git a/Grayjay.Engine/Pagers/RefreshDistributionContentPager.cs b/Grayjay.Engine/Pagers/RefreshDistributionContentPager.cs index 1a76379..24bfc26 100644 --- a/Grayjay.Engine/Pagers/RefreshDistributionContentPager.cs +++ b/Grayjay.Engine/Pagers/RefreshDistributionContentPager.cs @@ -9,12 +9,19 @@ namespace Grayjay.Engine.Pagers { public class RefreshDistributionContentPager : MultiRefreshPager { - public RefreshDistributionContentPager(IEnumerable> pagers, IEnumerable>> pendingPagers, IEnumerable> placeholderPager, Action> onChanged = null, int pageSize = 20) : base(pagers, pendingPagers, placeholderPager, onChanged, pageSize) + private readonly Func? _filter; + + public RefreshDistributionContentPager(IEnumerable> pagers, IEnumerable>> pendingPagers, IEnumerable> placeholderPager, Action> onChanged = null, int pageSize = 20, Func? filter = null) : base(pagers, pendingPagers, placeholderPager, onChanged, pageSize) { + _filter = filter; } protected override IPager RecreatePager(List> pagers) { + if (_filter != null) + { + pagers = pagers.Select(x => x is FilterPager ? x : (IPager)new FilterPager(x, _filter)).ToList(); + } return new MultiDistributionPager(pagers.ToDictionary(x => x, y => 1f), false, _pageSize); } }