{"version":3,"sources":["../../src/patternEnforcer.mts"],"sourcesContent":["/**\n * create a singleton using the function provided.\n * @param func - a function that will be called to create the instance.\n * @returns A function that return a singleton instance of the type T for a given label.\n */\nexport function createSingleton<T>(\n  func: (...args: any[]) => T\n): (label?: string, ...args: any[]) => T {\n  const instance: Record<string, T> = {};\n  return (label = 'default', ...args: any[]): T => {\n    if (!instance[label]) {\n      instance[label] = func(label, ...args);\n    }\n    return instance[label];\n  };\n}\n\n/**\n * given a function fn, repeat it every interval milliseconds.\n * rc.start() to start the repeater\n * rc.stop() to stop the repeater\n * createRepeater(fn, 5000); // run fn every 5 seconds\n * @param fn\n * @param interval\n * @returns\n */\nexport function createRepeater(fn: Function, interval: number) {\n  let timer: undefined | number;\n\n  return {\n    start() {\n      if (!timer) {\n        timer = setInterval(fn, interval);\n      }\n    },\n    stop() {\n      if (timer) {\n        clearInterval(timer);\n        timer = undefined;\n      }\n    },\n  };\n}\n\n///////////////\n\ntype StepFn<I, A extends any[], O> = (value: I, ...args: A) => O | Promise<O>;\n\nclass Chainer<T> extends Promise<T> {\n  private chainPromise: Promise<T>;\n\n  constructor(initial: T) {\n    const chainPromise = Promise.resolve(initial);\n    super((resolve, reject) => {\n      chainPromise.then(resolve).catch(reject);\n    });\n    this.chainPromise = chainPromise;\n  }\n\n  step<A extends any[], R>(fn: StepFn<T, A, R>, ...args: any[]): Chainer<R> {\n    const nextChainer = new Chainer(undefined as any);\n    (nextChainer as any).chainPromise = this.chainPromise.then((v) => fn(v, ...(args as any)));\n    return nextChainer;\n  }\n\n  s<A extends any[], R>(fn: StepFn<T, A, R>, ...args: any[]): Chainer<R> {\n    return this.step(fn, ...args);\n  }\n\n  static from<T>(initial: T): Chainer<T> {\n    return new Chainer(initial);\n  }\n}\n\n/**\n * chains multiple functions/steps together. Each step can be synchronous or asynchronous.\n * Each step receives the result of the previous step as the first parameter. more parameters can be passed after that.\n * To calculate the final result, use `await` on the returned Chainer.\n * @param initial initial value to start\n * @returns final result\n * @example\n * ```ts\n * import { chainer } from \"@devbro/pashmak/helpers\";\n * const add = (x: number, y: number, z: number) => x + y + z;\n * const multiply = (x: number, y: number) => x * y;\n *\n * const result = await chainer(4)\n *   .step(add, 2, 0)        // 4 + 2 = 6\n *   .step(multiply, 3)   // 6 * 3 = 18\n */\nexport function chainer<T>(initial: T): Chainer<T> {\n  return Chainer.from(initial);\n}\n\n/**\n * Checks if a variable is a class constructor.\n * @param variable - The variable to check\n * @returns True if the variable is a class, false otherwise\n */\nexport function isClass(variable: any) {\n  return (\n    typeof variable === 'function' && /^class\\s/.test(Function.prototype.toString.call(variable))\n  );\n}\n\n/**\n * Checks if a variable is a function (but not a class constructor).\n * @param variable - The variable to check\n * @returns True if the variable is a function and not a class, false otherwise\n */\nexport function isFunction(variable: any) {\n  return typeof variable === 'function' && !isClass(variable);\n}\n"],"mappings":";;AAKO,SAAS,gBACd,MACuC;AACvC,QAAM,WAA8B,CAAC;AACrC,SAAO,CAAC,QAAQ,cAAc,SAAmB;AAC/C,QAAI,CAAC,SAAS,KAAK,GAAG;AACpB,eAAS,KAAK,IAAI,KAAK,OAAO,GAAG,IAAI;AAAA,IACvC;AACA,WAAO,SAAS,KAAK;AAAA,EACvB;AACF;AAVgB;AAqBT,SAAS,eAAe,IAAc,UAAkB;AAC7D,MAAI;AAEJ,SAAO;AAAA,IACL,QAAQ;AACN,UAAI,CAAC,OAAO;AACV,gBAAQ,YAAY,IAAI,QAAQ;AAAA,MAClC;AAAA,IACF;AAAA,IACA,OAAO;AACL,UAAI,OAAO;AACT,sBAAc,KAAK;AACnB,gBAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACF;AAhBgB;AAsBhB,MAAM,gBAAmB,QAAW;AAAA,EAhDpC,OAgDoC;AAAA;AAAA;AAAA,EAC1B;AAAA,EAER,YAAY,SAAY;AACtB,UAAM,eAAe,QAAQ,QAAQ,OAAO;AAC5C,UAAM,CAAC,SAAS,WAAW;AACzB,mBAAa,KAAK,OAAO,EAAE,MAAM,MAAM;AAAA,IACzC,CAAC;AACD,SAAK,eAAe;AAAA,EACtB;AAAA,EAEA,KAAyB,OAAwB,MAAyB;AACxE,UAAM,cAAc,IAAI,QAAQ,MAAgB;AAChD,IAAC,YAAoB,eAAe,KAAK,aAAa,KAAK,CAAC,MAAM,GAAG,GAAG,GAAI,IAAY,CAAC;AACzF,WAAO;AAAA,EACT;AAAA,EAEA,EAAsB,OAAwB,MAAyB;AACrE,WAAO,KAAK,KAAK,IAAI,GAAG,IAAI;AAAA,EAC9B;AAAA,EAEA,OAAO,KAAQ,SAAwB;AACrC,WAAO,IAAI,QAAQ,OAAO;AAAA,EAC5B;AACF;AAkBO,SAAS,QAAW,SAAwB;AACjD,SAAO,QAAQ,KAAK,OAAO;AAC7B;AAFgB;AAST,SAAS,QAAQ,UAAe;AACrC,SACE,OAAO,aAAa,cAAc,WAAW,KAAK,SAAS,UAAU,SAAS,KAAK,QAAQ,CAAC;AAEhG;AAJgB;AAWT,SAAS,WAAW,UAAe;AACxC,SAAO,OAAO,aAAa,cAAc,CAAC,QAAQ,QAAQ;AAC5D;AAFgB;","names":[]}