1.2.0 • Published 3 years ago

rakkiisto-utils v1.2.0

Weekly downloads
-
License
MIT
Repository
github
Last release
3 years ago

rakkiisto-utils

rakkiisto utils by rakkiisto

extend (function)

how to use:

// original definition
Foo.bar = function (a: T, b: T): T {
  return a + b
}
Foo.bar(2, 3) // 5

extend(Foo, {
  bar: (a, b) => a * b
}, 'override')
Foo.bar(2, 3) // 6

// caution: order won't preserved
extend(Foo, {
  bar: {
    prerun: () => console.log('start'),
    args: (a, b) => [a + 1, b + 1],
    relay: (c, a, b) => c / (a * b),
    postrun: () => console.log('end'),
  }
})
Foo.bar(2, 3) // 2

extend function has 8 modes: attach, relay, override, overload, args, gate, prerun, postrun

default mode is attach

// copy the original function...
var _bar = Foo.bar

// prerun: runs before original function, with same arguments
Foo.bar = function (a, b) {
  prerun(a, b)
  return _bar(a, b)
}

// args: process the arguments, passes it to original function
Foo.bar = function (a, b) {
  return _bar(args(a, b))
}

// relay: receives original return value as first arg, and original arguments array as second arg.
Foo.bar = function (...args) {
  return relay(_bar(...args), args)
}

function relay(originalReturn: T, originalArguments: T[]) {
  //...
}

// attach: runs after original function, return new value instead of original return
Foo.bar = function (a, b) {
  _bar(a, b)
  return attach(a, b)
}

// postrun: runs after original function, return original value instead of callback return
Foo.bar = function (a, b) {
  const originalReturn = _bar(a, b)
  postrun(a, b)
  return originalReturn
}

// overload: passes the original function as first arg without calling, arguments array as second arg.
Foo.bar = function (...args) {
  return overload(_bar, args)
}

function overload(originalFunc: (a: T, b: T) => T, originalArgs: T[]) {
  const start = performance.now()

  for (let i = 0; i < 10000; i++) {
    const [a, b] = originalArgs
    const ret = originalFunc(a + i, b * i)
  }

  const end = performance.now() - start
  console.log(`elapsed ${end} ms`)
  return end
}

// override: replaces the original function to new one.
Foo.bar = function (a, b) {
  return override(a, b)
}

// gate: skips running original function if callback returns falsy value
Foo.bar = function (a, b) {
  if (gate(a, b)) return _bar(a, b)
}