{"version":3,"file":"index.mjs","sources":["../src/index.js"],"sourcesContent":["export function define(strategies, mixins) {\n  class Mixinable {\n    constructor(...args) {\n      var mixinstances = (mixins || []).map((Mixin) => {\n        return new Mixin(...args);\n      });\n      Object.keys(strategies || {}).forEach((method) => {\n        this[method] = strategies[method].bind(\n          this,\n          mixinstances.reduce((functions, mixinstance) => {\n            if (isFunction(mixinstance[method])) {\n              functions.push(mixinstance[method].bind(mixinstance));\n            }\n            return functions;\n          }, [])\n        );\n        mixinstances.forEach((mixinstance) => {\n          mixinstance[method] = this[method];\n        });\n      });\n    }\n  }\n\n  return function createMixinable(...args) {\n    return new Mixinable(...args);\n  };\n}\n\nexport function override(functions, ...args) {\n  var fn = functions.slice().pop();\n  if (isFunction(fn)) {\n    return fn(...args);\n  }\n}\n\nexport { override as callable };\n\nexport function parallel(functions, ...args) {\n  var results = functions.map((fn) => {\n    return fn(...args);\n  });\n  return results.find(isPromise) ? Promise.all(results) : results;\n}\n\nexport function pipe(functions, initial, ...args) {\n  return functions.reduce((result, fn) => {\n    if (isPromise(result)) {\n      return result.then((result) => {\n        return fn(result, ...args);\n      });\n    }\n    return fn(result, ...args);\n  }, initial);\n}\n\nexport function compose(functions, ...args) {\n  return pipe(functions.slice().reverse(), ...args);\n}\n\nexport const async = {\n  callable: function callableAsync(...args) {\n    return asynchronize(override)(...args);\n  },\n  override: function overrideAsync(...args) {\n    return asynchronize(override)(...args);\n  },\n  parallel: function parallelAsync(...args) {\n    return asynchronize(parallel)(...args);\n  },\n  pipe: function pipeAsync(...args) {\n    return asynchronize(pipe)(...args);\n  },\n  compose: function composeAsync(...args) {\n    return asynchronize(compose)(...args);\n  },\n};\n\nexport const sync = {\n  callable: function callableSync(...args) {\n    return synchronize(override)(...args);\n  },\n  override: function overrideSync(...args) {\n    return synchronize(override)(...args);\n  },\n  sequence: function sequenceSync(...args) {\n    return synchronize(parallel)(...args);\n  },\n  parallel: function parallelSync(...args) {\n    return synchronize(parallel)(...args);\n  },\n  pipe: function pipeSync(...args) {\n    return synchronize(pipe)(...args);\n  },\n  compose: function composeSync(...args) {\n    return synchronize(compose)(...args);\n  },\n};\n\n// utilities\n\nfunction isFunction(obj) {\n  return typeof obj === 'function';\n}\n\nfunction isPromise(obj) {\n  return obj && isFunction(obj.then) && obj instanceof Promise;\n}\n\nfunction asynchronize(fn) {\n  return function asyncFn(...args) {\n    var obj = fn(...args);\n    return isPromise(obj) ? obj : Promise.resolve(obj);\n  };\n}\n\nfunction synchronize(fn) {\n  return function syncFn(...args) {\n    var obj = fn(...args);\n    if (isPromise(obj)) {\n      throw new Error('got promise in sync mode');\n    }\n    return obj;\n  };\n}\n"],"names":["define","strategies","mixins","Mixinable","mixinstances","map","Mixin","Object","keys","forEach","method","_this","bind","reduce","functions","mixinstance","isFunction","push","override","fn","slice","pop","parallel","results","find","isPromise","Promise","all","pipe","initial","args","result","then","compose","reverse","async","callable","asynchronize","sync","synchronize","sequence","obj","resolve","Error"],"mappings":"shBAAgBA,EAAOC,EAAYC,OAC3BC,EACJ,kCACMC,GAAgBF,GAAU,IAAIG,IAAI,SAACC,GACrC,SAAWA,sBAEbC,OAAOC,KAAKP,GAAc,IAAIQ,QAAQ,SAACC,GACrCC,EAAKD,GAAUT,EAAWS,GAAQE,KAChCD,EACAP,EAAaS,OAAO,SAACC,EAAWC,GAI9B,OAHIC,EAAWD,EAAYL,KACzBI,EAAUG,KAAKF,EAAYL,GAAQE,KAAKG,IAEnCD,GACN,KAELV,EAAaK,QAAQ,SAACM,GACpBA,EAAYL,GAAUC,EAAKD,QAMnC,kBACE,SAAWP,sCAICe,EAASJ,GACvB,IAAIK,EAAKL,EAAUM,QAAQC,MAC3B,GAAIL,EAAWG,GACb,OAAOA,oDAMKG,EAASR,mBACnBS,EAAUT,EAAUT,IAAI,SAACc,GAC3B,OAAOA,qCAET,OAAOI,EAAQC,KAAKC,GAAaC,QAAQC,IAAIJ,GAAWA,WAG1CK,EAAKd,EAAWe,OAAYC,6BAC1C,OAAOhB,EAAUD,OAAO,SAACkB,EAAQZ,GAC/B,OAAIM,EAAUM,GACLA,EAAOC,KAAK,SAACD,GAClB,OAAOZ,gBAAGY,UAAWD,MAGlBX,gBAAGY,UAAWD,KACpBD,YAGWI,EAAQnB,GACtB,OAAOc,gBAAKd,EAAUM,QAAQc,+CAGnBC,IAAAA,EAAQ,CACnBC,SAAU,WACR,OAAOC,EAAanB,2CAEtBA,SAAU,WACR,OAAOmB,EAAanB,2CAEtBI,SAAU,WACR,OAAOe,EAAaf,2CAEtBM,KAAM,WACJ,OAAOS,EAAaT,2CAEtBK,QAAS,WACP,OAAOI,EAAaJ,4CAIXK,EAAO,CAClBF,SAAU,WACR,OAAOG,EAAYrB,2CAErBA,SAAU,WACR,OAAOqB,EAAYrB,2CAErBsB,SAAU,WACR,OAAOD,EAAYjB,2CAErBA,SAAU,WACR,OAAOiB,EAAYjB,2CAErBM,KAAM,WACJ,OAAOW,EAAYX,2CAErBK,QAAS,WACP,OAAOM,EAAYN,4CAMvB,SAASjB,EAAWyB,GAClB,MAAsB,mBAARA,EAGhB,SAAShB,EAAUgB,GACjB,OAAOA,GAAOzB,EAAWyB,EAAIT,OAASS,aAAef,QAGvD,SAASW,EAAalB,GACpB,kBACE,IAAIsB,EAAMtB,yCACV,OAAOM,EAAUgB,GAAOA,EAAMf,QAAQgB,QAAQD,IAIlD,SAASF,EAAYpB,GACnB,kBACE,IAAIsB,EAAMtB,yCACV,GAAIM,EAAUgB,GACZ,UAAUE,MAAM,4BAElB,OAAOF"}