@synstack/pipe
Version:
Simple typesafe pipe utility for Functional Programming
1 lines • 2.86 kB
Source Map (JSON)
{"version":3,"sources":["../src/pipe.index.ts","../src/pipe.lib.ts"],"sourcesContent":["export { Pipeable, pipe } from \"./pipe.lib.ts\";\nexport type { Pipe } from \"./pipe.lib.ts\";\n","export type PipeFn<V, R> = (value: V) => R;\n\nexport abstract class Pipeable<TInstance = any, TValue = any> {\n public _<R extends Pipeable>(fn: PipeFn<TInstance, R>): R;\n public _<R extends Promise<any>>(fn: PipeFn<TInstance, R>): R;\n public _<R>(fn: PipeFn<TInstance, R>): Pipe<R>;\n public _<R>(fn: PipeFn<TInstance, R>): R | Pipe<R> {\n const value = this.instanceOf();\n\n const res = fn(value);\n if (res instanceof Promise) return res;\n if (res instanceof Pipeable) return res;\n return new Pipe(res);\n }\n\n public _$<R extends Pipeable<any, any>>(fn: PipeFn<TValue, R>): R;\n public _$<R extends Promise<any>>(fn: PipeFn<TValue, R>): R;\n public _$<R>(fn: PipeFn<TValue, R>): Pipe<R>;\n public _$<R>(fn: PipeFn<TValue, R>): R | Pipe<R> {\n const res = fn(this.valueOf());\n if (res instanceof Promise) return res;\n if (res instanceof Pipeable) return res;\n return new Pipe(res);\n }\n\n public get $(): TValue {\n return this.valueOf();\n }\n\n public abstract instanceOf(): TInstance;\n\n public abstract valueOf(): TValue;\n}\n\nexport class Pipe<V> extends Pipeable<V, V> {\n private readonly value: V;\n\n public constructor(value: V) {\n super();\n this.value = value;\n }\n\n public static from<V>(value: V) {\n return new Pipe<V>(value);\n }\n\n public valueOf(): V {\n return this.value;\n }\n\n public instanceOf(): V {\n return this.value;\n }\n}\n\n// Todo: merge with resolved pipe\n\n/**\n * Create a new pipe\n * @param value the initial value\n * @returns a pipe instance with the initial value\n */\nexport function pipe<V extends Pipeable>(value: V): V;\nexport function pipe<V extends Promise<any>>(value: V): V;\nexport function pipe<V>(value: V): Pipe<V>;\nexport function pipe<V>(value: V) {\n if (value instanceof Pipeable) return value;\n return new Pipe(value);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEO,IAAe,WAAf,MAAe,UAAwC;AAAA,EAIrD,EAAK,IAAuC;AACjD,UAAM,QAAQ,KAAK,WAAW;AAE9B,UAAM,MAAM,GAAG,KAAK;AACpB,QAAI,eAAe,QAAS,QAAO;AACnC,QAAI,eAAe,UAAU,QAAO;AACpC,WAAO,IAAI,KAAK,GAAG;AAAA,EACrB;AAAA,EAKO,GAAM,IAAoC;AAC/C,UAAM,MAAM,GAAG,KAAK,QAAQ,CAAC;AAC7B,QAAI,eAAe,QAAS,QAAO;AACnC,QAAI,eAAe,UAAU,QAAO;AACpC,WAAO,IAAI,KAAK,GAAG;AAAA,EACrB;AAAA,EAEA,IAAW,IAAY;AACrB,WAAO,KAAK,QAAQ;AAAA,EACtB;AAKF;AAEO,IAAM,OAAN,MAAM,cAAgB,SAAe;AAAA,EACzB;AAAA,EAEV,YAAY,OAAU;AAC3B,UAAM;AACN,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,OAAc,KAAQ,OAAU;AAC9B,WAAO,IAAI,MAAQ,KAAK;AAAA,EAC1B;AAAA,EAEO,UAAa;AAClB,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,aAAgB;AACrB,WAAO,KAAK;AAAA,EACd;AACF;AAYO,SAAS,KAAQ,OAAU;AAChC,MAAI,iBAAiB,SAAU,QAAO;AACtC,SAAO,IAAI,KAAK,KAAK;AACvB;","names":[]}