123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- #unittest {
- name: "List resize.";
- result: "[2,4,6,8,10,12,14,16,18]";
- };
- // BEGIN PARRO CODE
- func raiseError(msg) {
- Fiber.abort(msg);
- }
- func reverseArgs(fn) {
- return func(/* args */) {
- var revertedArgs = [];
- for (var i in (_args.count - 1) ... 0) {
- revertedArgs.push(_args[i]);
- }
- return fn.apply(null, revertedArgs);
- }
- }
- func compose(/* fns */) {
- if (_args.count < 1) {
- return raiseError('Arguments must contain at least one function.');
- }
- var lastFn = _args.pop();
- var otherFns = _args;
-
- return func(/* first fn args */) {
- var result = lastFn.apply(null, _args);
- for (var i in (otherFns.count - 1) ... 0) {
- var fn = otherFns[i];
- result = fn(result);
- }
- return result;
- }
- }
- var pipe = reverseArgs(compose);
- func curry (arity, fn) {
- var accumulatedArgs = [];
- return func() {
- accumulatedArgs = concat(accumulatedArgs, _args);
-
- if (accumulatedArgs.count == arity) {
- return fn.apply(null, accumulatedArgs);
- }
- return _func;
- };
- }
- func concat(arr1, arr2) {
- var result = [];
- for (var item in arr1) {
- result.push(item);
- }
- for (var item in arr2) {
- result.push(item);
- }
- return result
- }
- func partial(fn /*...args*/) {
- var argsToApply = [];
-
- for (var i in 1 ..< _args.count) {
- argsToApply.push(_args[i]);
- }
-
- return func() {
- var args = concat(argsToApply, _args);
- return fn.apply(null, args);
- }
- }
- var map = curry(2, func(fn, data) {
- if (!(fn is Closure)) {
- return raiseError('First argument must be a function.');
- }
-
- var results = [];
- var idx = 0;
-
- for (var item in data) {
- results[idx] = fn(item, idx);
- idx += 1;
- }
-
- return results;
- });
- var filter = curry(2, func(fn, data) {
- if (!(fn is Closure)) {
- return raiseError('First argument must be a function.');
- }
-
- var results = [];
- var idx = 0;
-
- for (var item in data) {
- if ( fn(item, idx) ) {
- results[idx] = item;
- idx += 1;
- }
- }
-
- return results;
- });
- var reduce = curry(3, func(fn, accumulator, data) {
- if (!(fn is Closure)) {
- return raiseError('First argument must be a function.');
- }
-
- var result = accumulator;
- var idx = 0;
-
- for (var item in data) {
- result = fn(result, item, idx);
- idx += 1;
- }
-
- return result;
- });
- // END PARRO CODE
- func double(x) {
- return x * 2
- }
- func main() {
- var list = [1,2,3,4,5,6,7,8,9]
- return map(double, list).String();
- }
|