JSFiddle - React, Tailwind, and code Playground

by bartek

HTML

<script src="https://searls.github.io/jasmine-all/jasmine-all-min.js"></script>

JavaScript

window.GFT = {
  partial: function(fn) {
    return function n() {
      var args = [].slice.call(arguments);
      if (args.length >= fn.length) {
        return fn.apply(null, args);
      } else {
        return function() {
          var thatArgs = [].slice.call(arguments);
          return n.apply(null, args.concat(thatArgs));
        }
      }
    }
  },
  compose: function() {
    var funcs = [].slice.call(arguments);
    return function() {
      var args = [].slice.call(arguments);
      for (var i = funcs.length - 1; i >= 0; i--) {
        args = [funcs[i].apply(this, args)];
      }
      return args[0];
    };
  },
  memoize: function(fn) {
    var memo = {};
    return function() {
      var args = [].slice.call(arguments);
      if (args in memo) {
        return memo[args];
      } else {
        return (memo[args] = fn.apply(null, args));
      }
    }
  },
};

describe('Functions test', function() {
  it('add', function() {
    var add = GFT.partial(function(a, b, c, d) {
      return a + b + c + d
    });
    var sum = add(1)(2, 3)(4);
    expect(sum).toEqual(10);
  });
  it('compose', function() {
    function add2(x) {
      return x + 2
    }

    function square(x) {
      return x * x
    }
    var add2AndSquare = GFT.compose(square, add2)
    var output = add2AndSquare(2);
    expect(output).toEqual(16);
  });
  it('memorize', function() {
    spyOn(console, 'log');
    var memoized = GFT.memoize(function(arg) {
      console.log('Function executed');
      return arg + 1;
    });
		memoized(6);
		memoized(6);
    memoized(6);
    expect(console.log).toHaveBeenCalledWith('Function executed');
  });
});