AbstractCalculator.cs 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. namespace InABox.WPF
  5. {
  6. public abstract class AbstractCalculatorFunction<TValue, TType> where TType : struct, IComparable
  7. {
  8. protected abstract TValue Calculate(TValue current, TValue next, TType type) ;
  9. public TValue Calculate(TValue[] value, TType type)
  10. {
  11. if (!value.Any())
  12. return default;
  13. var result = value.First();
  14. result = value.Skip(1).Aggregate(result, (current, next) => Calculate(current, next, type));
  15. return result;
  16. }
  17. }
  18. public abstract class AbstractCalculator<TValue,TFunction, TType> : AbstractMultiConverter<TValue,TValue>
  19. where TFunction : AbstractCalculatorFunction<TValue,TType>, new()
  20. where TType : struct, IComparable
  21. {
  22. public TValue Default { get; private set; }
  23. public TType Type { get; set; }
  24. public TFunction Function { get; private set; }
  25. protected AbstractCalculator()
  26. {
  27. Default = default;
  28. Function = new TFunction();
  29. }
  30. protected override TValue Convert(IEnumerable<TValue> value, object parameter = null)
  31. {
  32. var enumerable = value as TValue[] ?? value?.ToArray() ?? new TValue[] { };
  33. if (Function == null || !enumerable.Any())
  34. return Default;
  35. var result = Function.Calculate(enumerable, Type);
  36. return result;
  37. }
  38. }
  39. }