Skip to content

Commit

Permalink
Split OrderByAsync from OrderBy
Browse files Browse the repository at this point in the history
  • Loading branch information
YohDeadfall committed Jan 1, 2024
1 parent 55eb235 commit 7b65f93
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 23 deletions.
24 changes: 4 additions & 20 deletions src/Kinetic/Linq/ObservableView.OrderBy.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,29 +13,12 @@ public static partial class ObservableView
public static ObserverBuilder<ListChange<T>> OrderBy<T, TKey>(this ObserverBuilder<ListChange<T>> source, Func<T, TKey> keySelector, IComparer<TKey>? keyComparer = null) =>
source.ContinueWith<OrderByCore<T, TKey>.StateMachineFactory, ListChange<T>>(new(keySelector, keyComparer));

public static ObserverBuilder<ListChange<T>> OrderBy<T, TKey>(this ObserverBuilder<ListChange<T>> source, ObserverBuilderFactory<T, TKey> keySelector, IComparer<TKey>? keyComparer = null) =>
source.ContinueWith<OrderByCore<T, TKey>.StateMachineFactory, ListChange<T>>(new(keySelector, keyComparer));

public static ObserverBuilder<ListChange<T>> OrderBy<T, TKey>(this ObserverBuilder<ListChange<T>> source, Func<T, Property<TKey>> keySelector, IComparer<TKey>? keyComparer = null) =>
source.OrderBy(item => keySelector(item).Changed.ToBuilder(), keyComparer);

public static ObserverBuilder<ListChange<T>> OrderBy<T, TKey>(this ObserverBuilder<ListChange<T>> source, Func<T, ReadOnlyProperty<TKey>> keySelector, IComparer<TKey>? keyComparer = null) =>
source.OrderBy(item => keySelector(item).Changed.ToBuilder(), keyComparer);

public static ObserverBuilder<ListChange<T>> OrderBy<T, TKey>(this ReadOnlyObservableList<T> source, Func<T, TKey> keySelector, IComparer<TKey>? keyComparer = null) =>
source.Changed.ToBuilder().OrderBy(keySelector, keyComparer);

public static ObserverBuilder<ListChange<T>> OrderBy<T, TKey>(this ReadOnlyObservableList<T> source, ObserverBuilderFactory<T, TKey> keySelector, IComparer<TKey>? keyComparer = null) =>
source.Changed.ToBuilder().OrderBy(keySelector, keyComparer);

public static ObserverBuilder<ListChange<T>> OrderBy<T, TKey>(this ReadOnlyObservableList<T> source, Func<T, Property<TKey>> keySelector, IComparer<TKey>? keyComparer = null) =>
source.Changed.ToBuilder().OrderBy(keySelector, keyComparer);

public static ObserverBuilder<ListChange<T>> OrderBy<T, TKey>(this ReadOnlyObservableList<T> source, Func<T, ReadOnlyProperty<TKey>> keySelector, IComparer<TKey>? keyComparer = null) =>
source.Changed.ToBuilder().OrderBy(keySelector, keyComparer);

private static class OrderByCore<T, TKey>
{
// A single element value tuple is used here to solve a conflict between interfaces.
private interface IStateMachine<TItem> :
IObserverStateMachine<ListChange<T>>,
IObserverStateMachine<ValueTuple<TItem>>,
Expand Down Expand Up @@ -138,7 +121,6 @@ public void Create<TContinuation>(in TContinuation continuation, ObserverStateMa
}
}

// A single element value tuple is used here to solve a conflict between interfaces.
private struct StateMachine<TItem, TKeySelector, TKeyComparer, TContinuation> :
IStateMachine<TItem>
where TItem : IItem<TItem>
Expand Down Expand Up @@ -167,7 +149,9 @@ public StateMachine(in TContinuation continuation, in TKeySelector keySelector,

public void Initialize(ObserverStateMachineBox box)
{
_continuation.Initialize(Box = box);
Box = box;

_continuation.Initialize(box);
_keyComparer.Initialize(ref this);
}

Expand Down
27 changes: 27 additions & 0 deletions src/Kinetic/Linq/ObservableView.OrderByAsync.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
using Kinetic.Linq.StateMachines;

namespace Kinetic.Linq;

public static partial class ObservableView
{
public static ObserverBuilder<ListChange<T>> OrderByAsync<T, TKey>(this ObserverBuilder<ListChange<T>> source, ObserverBuilderFactory<T, TKey> keySelector, IComparer<TKey>? keyComparer = null) =>
source.ContinueWith<OrderByCore<T, TKey>.StateMachineFactory, ListChange<T>>(new(keySelector, keyComparer));

public static ObserverBuilder<ListChange<T>> OrderByAsync<T, TKey>(this ObserverBuilder<ListChange<T>> source, Func<T, Property<TKey>> keySelector, IComparer<TKey>? keyComparer = null) =>
source.OrderByAsync(item => keySelector(item).Changed.ToBuilder(), keyComparer);

public static ObserverBuilder<ListChange<T>> OrderByAsync<T, TKey>(this ObserverBuilder<ListChange<T>> source, Func<T, ReadOnlyProperty<TKey>> keySelector, IComparer<TKey>? keyComparer = null) =>
source.OrderByAsync(item => keySelector(item).Changed.ToBuilder(), keyComparer);

public static ObserverBuilder<ListChange<T>> OrderByAsync<T, TKey>(this ReadOnlyObservableList<T> source, ObserverBuilderFactory<T, TKey> keySelector, IComparer<TKey>? keyComparer = null) =>
source.Changed.ToBuilder().OrderByAsync(keySelector, keyComparer);

public static ObserverBuilder<ListChange<T>> OrderByAsync<T, TKey>(this ReadOnlyObservableList<T> source, Func<T, Property<TKey>> keySelector, IComparer<TKey>? keyComparer = null) =>
source.OrderByAsync(item => keySelector(item).Changed.ToBuilder(), keyComparer);

public static ObserverBuilder<ListChange<T>> OrderByAsync<T, TKey>(this ReadOnlyObservableList<T> source, Func<T, ReadOnlyProperty<TKey>> keySelector, IComparer<TKey>? keyComparer = null) =>
source.OrderByAsync(item => keySelector(item).Changed.ToBuilder(), keyComparer);

}
6 changes: 3 additions & 3 deletions test/Kinetic.Tests/ObservableViewTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ namespace Kinetic.Linq.Tests;
public class ObservableViewTests
{
[Fact]
public void OrderBy_StaticKey()
public void OrderBy()
{
var list = new ObservableList<Item>();
var view = list.OrderBy(item => item.Number.Get()).ToView();
Expand Down Expand Up @@ -60,10 +60,10 @@ public void OrderBy_StaticKey()
}

[Fact]
public void OrderBy_DynamicKey()
public void OrderByAsync()
{
var list = new ObservableList<Item>();
var view = list.OrderBy(item => item.Number).ToView();
var view = list.OrderByAsync(item => item.Number).ToView();

var itemA = new Item(0, "A");
var itemB = new Item(1, "B");
Expand Down

0 comments on commit 7b65f93

Please sign in to comment.