balances.ts 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import { Balance } from '@polkadot/types/interfaces';
  2. import { createType } from '@joystream/types';
  3. export const Zero = createType('Balance', 0);
  4. export const One = createType('Balance', 1);
  5. export const Add = (x: Balance, y: Balance): Balance => createType('Balance', x.add(y));
  6. export const Sub = (x: Balance, y: Balance): Balance => createType('Balance', x.sub(y));
  7. export const Sum = (balances: Balance[]): Balance => balances.reduce(Add, Zero);
  8. export const Avg = (xs: Balance[]): Balance =>
  9. xs[0] === undefined ? Zero : createType('Balance', Sum(xs).divn(xs.length));
  10. export const AvgDelta = (xs: Balance[]): Balance => {
  11. if (xs.length < 2) {
  12. return One;
  13. }
  14. const pairs: Balance[] = [];
  15. xs.forEach((x, i) => {
  16. if (i > 0) {
  17. pairs.push(Sub(x, xs[i - 1]));
  18. }
  19. });
  20. return Avg(pairs);
  21. };
  22. // An average value to 'step' up balances, like on the nudge controls for a slider
  23. export const Step = (xs: Balance[], ticks = 10): Balance => createType('Balance', Avg(xs).divn(ticks));
  24. export const Min = (x: Balance, min: Balance = One): Balance => x.gte(min) ? x : min;
  25. export const Sort = (xs: Balance[]): Balance[] => {
  26. xs.sort((a, b): number => {
  27. if (a.eq(b)) {
  28. return 0;
  29. } else if (a.gt(b)) {
  30. return 1;
  31. }
  32. return -1;
  33. });
  34. return xs;
  35. };