//using System.Linq.Expressions; //using System.Numerics; //using System.Reflection; //namespace Modules.Library.Domain.Utils; //internal abstract class OrderBaseUtil where TOrder : INumber //{ // protected abstract Expression>? GetOrderPropertyExpression(); // private readonly List _items; // public OrderBaseUtil(List items, Expression> getOrderPropertyExpression) // { // _getOrderPropertyExpression = getOrderPropertyExpression; // _items = items; // _getOrderProperty = getOrderPropertyExpression.Compile(); // var getOrderValueEx = Expression.Invoke(getOrderPropertyExpression, Expression.Parameter(typeof(T))); // _incrementOrder = Expression.Lambda>(Expression.Add(getOrderValueEx, Expression.Constant(1))).Compile(); // _decrementOrder = Expression.Lambda>(Expression.Subtract(getOrderValueEx, Expression.Constant(1))).Compile(); // var tOrderParameterEx = Expression.Parameter(typeof(TOrder)); // _isLessThanOrEqual = Expression.Lambda>(Expression.LessThanOrEqual(getOrderValueEx, tOrderParameterEx)).Compile(); // _isGraterThanOrEqual = Expression.Lambda>(Expression.GreaterThanOrEqual(getOrderValueEx, tOrderParameterEx)).Compile(); // } // private static Func GetOrderProperty() => GetOrderPropertyExpression?.Compile() ?? throw new NotImplementedException(); // private readonly Func _incrementOrder; // private readonly Func _decrementOrder; // private readonly Func _isLessThanOrEqual; // private readonly Func _isGraterThanOrEqual; // private void SetItemOrder(TOrder lastOrder, TOrder newOrder) // { // if (IsOrderOutOfRange(lastOrder)) throw new ArgumentOutOfRangeException(nameof(lastOrder)); // if (IsOrderOutOfRange(newOrder)) throw new ArgumentOutOfRangeException(nameof(newOrder)); // var minOrder = Min(lastOrder, newOrder); // var maxOrder = Max(lastOrder, newOrder); // var orderedItems = OrderedItemsInsideRange(minOrder, maxOrder); // var targetItem = orderedItems.First(q => _getOrderProperty(q) == newOrder); // bool seen = false; // for (int i = 0; i < orderedItems.Count; i++) // { // if (object.ReferenceEquals(_items[i], targetItem)) // { // SetOrderValue(orderedItems[i], newOrder); //orderedItems[i].Order = newOrder; // seen = true; // } // //else if (seen && items[i].Order <= newOrder) // else if (seen && _isLessThanOrEqual(_items[i], newOrder)) // { // DecrementOrder(orderedItems[i]); //orderedItems[i].Order--; // move it left // } // //else if (items[i].Order >= newOrder) // else if (_isGraterThanOrEqual(_items[i], newOrder)) // { // IncrementOrder(orderedItems[i]); //orderedItems[i].Order++; // move it right // } // } // } // protected abstract List OrderedItemsInsideRange(TOrder min, TOrder max); // protected abstract TOrder Max(TOrder one, TOrder another); // protected abstract TOrder Min(TOrder one, TOrder another); // protected abstract bool IsOrderOutOfRange(TOrder order); // private void SetOrderValue(T item, TOrder value) => item.SetPropertyValue(GetOrderPropertyExpression, value); // private void IncrementOrder(T item) => item.SetPropertyValue(GetOrderPropertyExpression, _incrementOrder(item)); // private void DecrementOrder(T item) => item.SetPropertyValue(GetOrderPropertyExpression, _decrementOrder(item)); //} //public static class LambdaExtensions //{ // public static void SetPropertyValue(this T target, Expression> memberLamda, TValue value) // { // var memberSelectorExpression = memberLamda.Body as MemberExpression; // if (memberSelectorExpression != null) // { // var property = memberSelectorExpression.Member as PropertyInfo; // if (property != null) // { // property.SetValue(target, value, null); // } // } // } //}