list_resize.gravity 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. #unittest {
  2. name: "List resize.";
  3. result: "[2,4,6,8,10,12,14,16,18]";
  4. };
  5. // BEGIN PARRO CODE
  6. func raiseError(msg) {
  7. Fiber.abort(msg);
  8. }
  9. func reverseArgs(fn) {
  10. return func(/* args */) {
  11. var revertedArgs = [];
  12. for (var i in (_args.count - 1) ... 0) {
  13. revertedArgs.push(_args[i]);
  14. }
  15. return fn.apply(null, revertedArgs);
  16. }
  17. }
  18. func compose(/* fns */) {
  19. if (_args.count < 1) {
  20. return raiseError('Arguments must contain at least one function.');
  21. }
  22. var lastFn = _args.pop();
  23. var otherFns = _args;
  24. return func(/* first fn args */) {
  25. var result = lastFn.apply(null, _args);
  26. for (var i in (otherFns.count - 1) ... 0) {
  27. var fn = otherFns[i];
  28. result = fn(result);
  29. }
  30. return result;
  31. }
  32. }
  33. var pipe = reverseArgs(compose);
  34. func curry (arity, fn) {
  35. var accumulatedArgs = [];
  36. return func() {
  37. accumulatedArgs = concat(accumulatedArgs, _args);
  38. if (accumulatedArgs.count == arity) {
  39. return fn.apply(null, accumulatedArgs);
  40. }
  41. return _func;
  42. };
  43. }
  44. func concat(arr1, arr2) {
  45. var result = [];
  46. for (var item in arr1) {
  47. result.push(item);
  48. }
  49. for (var item in arr2) {
  50. result.push(item);
  51. }
  52. return result
  53. }
  54. func partial(fn /*...args*/) {
  55. var argsToApply = [];
  56. for (var i in 1 ..< _args.count) {
  57. argsToApply.push(_args[i]);
  58. }
  59. return func() {
  60. var args = concat(argsToApply, _args);
  61. return fn.apply(null, args);
  62. }
  63. }
  64. var map = curry(2, func(fn, data) {
  65. if (!(fn is Closure)) {
  66. return raiseError('First argument must be a function.');
  67. }
  68. var results = [];
  69. var idx = 0;
  70. for (var item in data) {
  71. results[idx] = fn(item, idx);
  72. idx += 1;
  73. }
  74. return results;
  75. });
  76. var filter = curry(2, func(fn, data) {
  77. if (!(fn is Closure)) {
  78. return raiseError('First argument must be a function.');
  79. }
  80. var results = [];
  81. var idx = 0;
  82. for (var item in data) {
  83. if ( fn(item, idx) ) {
  84. results[idx] = item;
  85. idx += 1;
  86. }
  87. }
  88. return results;
  89. });
  90. var reduce = curry(3, func(fn, accumulator, data) {
  91. if (!(fn is Closure)) {
  92. return raiseError('First argument must be a function.');
  93. }
  94. var result = accumulator;
  95. var idx = 0;
  96. for (var item in data) {
  97. result = fn(result, item, idx);
  98. idx += 1;
  99. }
  100. return result;
  101. });
  102. // END PARRO CODE
  103. func double(x) {
  104. return x * 2
  105. }
  106. func main() {
  107. var list = [1,2,3,4,5,6,7,8,9]
  108. return map(double, list).String();
  109. }