Commit aa868f68 authored by Fernando Basso's avatar Fernando Basso
Browse files

leetcode(js): compose() v1 with for loop

parent 17b271f2
Loading
Loading
Loading
Loading
+35 −0
Original line number Diff line number Diff line
@@ -295,3 +295,38 @@ function reduce(xs, fn, init) {

export { reduce };
```

### Function Composition (compose())

- [Function Composition on LeetCode](https://leetcode.com/problems/function-composition/description/?envType=study-plan-v2&envId=30-days-of-javascript).

#### for loop

```javascript
/**
 * Applies all functions from left to right. Works as the identity
 * function if `fns` is empty.
 *
 * - T.C: Depends on T.C of input `fns` and `val`.
 * - S.C: Same notes as T.C apply.
 *
 * @param {Array<Function>} fns
 * @returns {(val: unknown) => unknown}
 */
function compose(fns) {
  /**
   * @param {unknown} val
   * @returns {unknown}
   */
  return function composed(val) {
    var lastFnIdx = fns.length - 1,
        result = val,
        i;

    for (i = lastFnIdx; i >= 0; --i)
      result = fns[i](result);

    return result;
  };
}
```
+29 −0
Original line number Diff line number Diff line
import { compose } from "./compose_v1";

describe("compose()", () => {
  it("is the identity function when fns is empty", () => {
    expect(compose([])(1)).toEqual(1);
  });

  it("composes a single function", () => {
    const add1 = n => n + 1;

    expect(compose([add1])(0)).toEqual(1);
  });

  it("composes from right to left", () => {
    const add1 = n => n + 1;
    const double = n => 2 * n;
    const square = n => n * n;

    //   add1(3) = 4
    // double(4) = 8
    // square(8) = 64
    expect(compose([square, double, add1])(3)).toEqual(64);

    // square(1) = 1
    //   add1(1) = 2
    // double(4) = 4
    expect(compose([square, double, add1])(3)).toEqual(64);
  });
});
+28 −0
Original line number Diff line number Diff line
/**
 * Applies all functions from left to right. Works as the identity
 * function if `fns` is empty.
 *
 * - T.C: Depends on T.C of input `fns` and `val`.
 * - S.C: Same notes as T.C apply.
 *
 * @param {Array<Function>} fns
 * @returns {(val: unknown) => unknown}
 */
function compose(fns) {
  /**
   * @param {unknown} val
   * @returns {unknown}
   */
  return function composed(val) {
    var lastFnIdx = fns.length - 1,
        result = val,
        i;

    for (i = lastFnIdx; i >= 0; --i)
      result = fns[i](result);

    return result;
  };
}

export { compose };