MyBookmark/Modules.Library.Domain/Utils/d/Order_.cs
2024-09-23 03:00:50 +03:00

178 lines
8.0 KiB
C#

//using Modules.Library.Domain.Entities;
//using System.Linq.Expressions;
//using System.Reflection;
//namespace Modules.Library.Domain.Utils;
//internal class Order_(IEnumerable<IOrderableItem> orderableItems)
//{
// //internal void SetItemOrder(ushort old, ushort @new)
// /*
// internal void SetItemOrder(ushort lastOrder, ushort newOrder)
// {
// if (newOrder < 0 || newOrder > orderableItems.Select(q => q.Order).DefaultIfEmpty<ushort>(0).Max())
// throw new ArgumentOutOfRangeException(nameof(newOrder));
// //if (lastOrder == newOrder) return;
// var newOrderItem = orderableItems.First(q => q.Order == newOrder);
// orderableItems.First(q => q.Order == lastOrder).Order = newOrder;
// foreach (var item in orderableItems.Where(q => q.Order > Math.Min(lastOrder, newOrder) && q.Order < Math.Max(lastOrder, newOrder)))
// {
// if (lastOrder > newOrder) item.Order++;
// else if (lastOrder < newOrder) item.Order--;
// }
// if (lastOrder > newOrder) newOrderItem.Order++;
// else if (lastOrder < newOrder) newOrderItem.Order--;
// }
// internal void SetItemOrder(ushort lastOrder, ushort newOrder)
// {
// if (newOrder < 0 || newOrder > orderableItems.Select(q => q.Order).DefaultIfEmpty<ushort>(0).Max())
// throw new ArgumentOutOfRangeException(nameof(newOrder));
// //if (lastOrder == newOrder) return;
// var newOrderItem = orderableItems.First(q => q.Order == newOrder);
// orderableItems.First(q => q.Order == lastOrder).Order = newOrder;
// foreach (var item in orderableItems.Where(q => q.Order > Math.Min(lastOrder, newOrder) && q.Order < Math.Max(lastOrder, newOrder)))
// {
// if (lastOrder > newOrder) item.Order++;
// else if (lastOrder < newOrder) item.Order--;
// }
// if (lastOrder > newOrder) newOrderItem.Order++;
// else if (lastOrder < newOrder) newOrderItem.Order--;
// }
// */
// private static Expression SetItemOrder(ushort lastOrder, ushort newOrder)
// {
// var parameterItemsEx = Expression.Parameter(typeof(List<IOrderableItem>));
// /*
// var propertyItemsOrderEx = Expression.Property(parameterItemsEx,
// typeof(IEnumerable<IOrderableItem>).GetProperty(nameof(IOrderableItem.Order))!.GetGetMethod()!);
// */
// var parameterOldOrderEx = Expression.Parameter(typeof(ushort));
// var parameterNewOrderEx = Expression.Parameter(typeof(ushort));
// Func<List<IOrderableItem>, ushort, IOrderableItem> getItemByOrder = (items, order) => items.First(q => q.Order == order);
// var getNewOrderItemEx = Expression.Invoke(Expression.Constant(getItemByOrder), [parameterItemsEx, parameterNewOrderEx]);
// var itemVariableEx = Expression.Variable(typeof(IOrderableItem));
// var orderVariableEx = Expression.Variable(typeof(ushort));
// Action<IOrderableItem, ushort> setItemOrder = (item, order) => item.SetPropertyValue(c => c.Order, order);
// var setItemOrderEx = Expression.Invoke(Expression.Constant(setItemOrder), [itemVariableEx, orderVariableEx]);
// var iteratorEx = Expression.Variable(typeof(int));
// var iteratorSetZeroEx = Expression.Assign(iteratorEx, Expression.Constant(0));
// Func<List<IOrderableItem>, int, IOrderableItem> getItemFunc = (list, i) => list[i];
// var getItemEx = Expression.Invoke(Expression.Constant(getItemFunc), [parameterItemsEx, iteratorEx]);
// Func<List<IOrderableItem>, int> itemsCountFunc = q => q.Count;
// var itemsCountEx = Expression.Invoke(Expression.Constant(itemsCountFunc), [parameterItemsEx]);
// LoopExpression loop = Expression.Loop(
// Expression.IfThenElse(
// // test
// Expression.LessThan(iteratorEx, itemsCountEx),
// // if true
// Expression.Block(
// [
// Expression.Condition()
// Expression.Increment(iteratorEx),
// ]
// ),
// // if false
// Expression.Break(loopBreakLabel)
// ), loopBreakLabel);
// return Expression.Block(
// new[] { enumeratorVar, classElementVar },
// // get enumerator from class collection
// Expression.Assign(enumeratorVar, getEnumeratorCall),
// // loop over classes
// loop);
// orderableItems.First(q => q.Order == lastOrder).Order = newOrder;
// var a = Expression.Lambda<IEnumerable<IOrderableItem>, ushort, bool>(IsOrderOutOfRange, [parameterItems, parameterNewOrder]);
// var checkNewOrderCondition = Expression.IsTrue();
// Func<IEnumerable<IOrderableItem>, ushort, bool> checkIfOrderOutOfRange = IsOrderOutOfRange;
// var checkIfOldOrderOutOfRangeEx = Expression.Invoke(Expression.Constant(checkIfOrderOutOfRange), [parameterItemsEx, parameterOldOrderEx]);
// var checkOldOrderCondition = Expression.Condition(Expression.IsFalse(checkIfOldOrderOutOfRangeEx), callNext, throw);
// var checkIfNewOrderOutOfRangeEx = Expression.Invoke(Expression.Constant(checkIfOrderOutOfRange), [parameterItemsEx, parameterNewOrderEx]);
// var checkNewOrderCondition = Expression.Condition(Expression.IsFalse(checkIfNewOrderOutOfRangeEx), checkOldOrderCondition, throw);
// if (newOrder < 0 || newOrder > orderableItems.Select(q => q.Order).DefaultIfEmpty<ushort>(0).Max())
// throw new ArgumentOutOfRangeException(nameof(newOrder));
// //if (lastOrder == newOrder) return;
// var newOrderItem = orderableItems.First(q => q.Order == newOrder);
// orderableItems.First(q => q.Order == lastOrder).Order = newOrder;
// foreach (var item in orderableItems.Where(q => q.Order > Math.Min(lastOrder, newOrder) && q.Order < Math.Max(lastOrder, newOrder)))
// {
// if (lastOrder > newOrder) item.Order++;
// else if (lastOrder < newOrder) item.Order--;
// }
// if (lastOrder > newOrder) newOrderItem.Order++;
// else if (lastOrder < newOrder) newOrderItem.Order--;
// }
// */
// /*
// internal static LambdaExpression UpdateOrderTo(IOrderableItem item, ushort order)
// {
// var orderItemParam = Expression.Parameter(typeof(IOrderableItem));
// var orderParam = Expression.Parameter(typeof(ushort));
// var destNewExpr = Expression.Assign(orderParam, Expression.Bind(typeof(IOrderableItem).GetProperty(nameof(IOrderableItem.Order))!, orderparam));
// var memberbindings = new List<MemberBinding>();
// IPerson_Name destName;
// IPerson_Name srcName;
// if ((tDest.IsInstanceOfType(typeof(IPerson_Name)) || tDest.IsInstanceOfType(typeof(Person))) &&
// (tSrc.IsInstanceOfType(typeof(IPerson_Name)) || tSrc.IsInstanceOfType(typeof(Person))))
// {
// memberbindings.Add(Expression.Bind(tDest.GetProperty("Name"), Expression.Property(personparam, "Name")));
// }
// var toEntityParameterExpression = Expression.MemberInit(destNewExpr, memberbindings);
// return Expression.Lambda(
// toEntityParameterExpression,
// personparam
// );
// }
// */
// private static bool IsOrderOutOfRange(IEnumerable<IOrderableItem> orderableItems, ushort order) => order < 0 ||
// order > orderableItems.Select(q => q.Order).DefaultIfEmpty<ushort>(0).Max();
//}
//public static class LambdaExtensions
//{
// public static void SetPropertyValue<T, TValue>(this T target, Expression<Func<T, TValue>> 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);
// }
// }
// }
//}