Skip to content

Instantly share code, notes, and snippets.

@geoffreak
Created September 25, 2016 14:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save geoffreak/a5b832838bce9d6b26719e1e5e26ec14 to your computer and use it in GitHub Desktop.
Save geoffreak/a5b832838bce9d6b26719e1e5e26ec14 to your computer and use it in GitHub Desktop.
Oibackoff typing generator (short and working!)
import * as fs from 'fs';
// Settings
let generics = ['a','b','c','d','e','f','g','h','i','j','k'];
let paramGenerics = ['o','p','q','r','s','t','u','v','w','x','y','z'];
let parameterName = 'p';
// File
let fileStream = fs.createWriteStream('index.d.ts');
// Generate the instance
let lines: string[] = [];
let functionCallbackNotation = `callback: (${generics.map(v => `${v}: ${v.toUpperCase()}`).join(', ')}) => any`;
let callbackArr: string[] = [];
for (let genericNumber = 0; genericNumber < generics.length; genericNumber++) {
let str = `${generics[genericNumber]}: ${generics[genericNumber].toUpperCase()}`;
if (genericNumber === 2) {
str = `priorErrorsOr${generics[genericNumber].toUpperCase()}: ${generics[genericNumber].toUpperCase()} | ${generics[0].toUpperCase()}[]`;
}
if (genericNumber == 1) {
str += ' | null';
}
if (genericNumber > 0) {
str += ' | undefined';
}
callbackArr.push(str);
}
let callbackNotation = `callback: (${callbackArr.join(', ')}) => void`;
// Loop through each allowed amount of backoff parameters
for (let maxParamNumber = 0; maxParamNumber <= paramGenerics.length; maxParamNumber++) {
// Build the list of backoff parameters
let backoffParams: string[] = [];
let callbackParams: string[] = [];
for (let paramNumber = 0; paramNumber < maxParamNumber; paramNumber++) {
backoffParams.push(`${parameterName}${paramNumber}: ${paramGenerics[paramNumber].toUpperCase()}`)
callbackParams.push(`${parameterName}${paramNumber}: ${paramGenerics[paramNumber].toUpperCase()}`)
}
callbackParams.push(functionCallbackNotation);
let genericNotation = `<${generics.concat(paramGenerics.slice(0, maxParamNumber)).map(v => v.toUpperCase()).join(',')}>`;
let immediateArgs: string[] = [];
immediateArgs.push(`fn: (${callbackParams.join(', ')}) => any`)
immediateArgs = immediateArgs.concat(backoffParams);
immediateArgs.push('intermediate: BackoffIntermediate<A>');
immediateArgs.push(callbackNotation);
lines.push(`${genericNotation}(${immediateArgs.join(', ')}): void;`)
let noImmediateArgs: string[] = [];
noImmediateArgs.push(`fn: (${callbackParams.join(', ')}) => any`)
noImmediateArgs = noImmediateArgs.concat(backoffParams);
noImmediateArgs.push(callbackNotation);
lines.push(`${genericNotation}(${noImmediateArgs.join(', ')}): void;`)
}
fileStream.write(`export declare interface BackoffInstance {\n ${lines.join('\n ')}\n}\n`);
export declare interface BackoffInstance {
<A,B,C,D,E,F,G,H,I,J,K>(fn: (callback: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I, j: J, k: K) => any) => any, intermediate: BackoffIntermediate<A>, callback: (a: A, b: B | null | undefined, priorErrorsOrC: C | A[] | undefined, d: D | undefined, e: E | undefined, f: F | undefined, g: G | undefined, h: H | undefined, i: I | undefined, j: J | undefined, k: K | undefined) => void): void;
<A,B,C,D,E,F,G,H,I,J,K>(fn: (callback: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I, j: J, k: K) => any) => any, callback: (a: A, b: B | null | undefined, priorErrorsOrC: C | A[] | undefined, d: D | undefined, e: E | undefined, f: F | undefined, g: G | undefined, h: H | undefined, i: I | undefined, j: J | undefined, k: K | undefined) => void): void;
<A,B,C,D,E,F,G,H,I,J,K,O>(fn: (p0: O, callback: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I, j: J, k: K) => any) => any, p0: O, intermediate: BackoffIntermediate<A>, callback: (a: A, b: B | null | undefined, priorErrorsOrC: C | A[] | undefined, d: D | undefined, e: E | undefined, f: F | undefined, g: G | undefined, h: H | undefined, i: I | undefined, j: J | undefined, k: K | undefined) => void): void;
<A,B,C,D,E,F,G,H,I,J,K,O>(fn: (p0: O, callback: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I, j: J, k: K) => any) => any, p0: O, callback: (a: A, b: B | null | undefined, priorErrorsOrC: C | A[] | undefined, d: D | undefined, e: E | undefined, f: F | undefined, g: G | undefined, h: H | undefined, i: I | undefined, j: J | undefined, k: K | undefined) => void): void;
<A,B,C,D,E,F,G,H,I,J,K,O,P>(fn: (p0: O, p1: P, callback: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I, j: J, k: K) => any) => any, p0: O, p1: P, intermediate: BackoffIntermediate<A>, callback: (a: A, b: B | null | undefined, priorErrorsOrC: C | A[] | undefined, d: D | undefined, e: E | undefined, f: F | undefined, g: G | undefined, h: H | undefined, i: I | undefined, j: J | undefined, k: K | undefined) => void): void;
<A,B,C,D,E,F,G,H,I,J,K,O,P>(fn: (p0: O, p1: P, callback: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I, j: J, k: K) => any) => any, p0: O, p1: P, callback: (a: A, b: B | null | undefined, priorErrorsOrC: C | A[] | undefined, d: D | undefined, e: E | undefined, f: F | undefined, g: G | undefined, h: H | undefined, i: I | undefined, j: J | undefined, k: K | undefined) => void): void;
<A,B,C,D,E,F,G,H,I,J,K,O,P,Q>(fn: (p0: O, p1: P, p2: Q, callback: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I, j: J, k: K) => any) => any, p0: O, p1: P, p2: Q, intermediate: BackoffIntermediate<A>, callback: (a: A, b: B | null | undefined, priorErrorsOrC: C | A[] | undefined, d: D | undefined, e: E | undefined, f: F | undefined, g: G | undefined, h: H | undefined, i: I | undefined, j: J | undefined, k: K | undefined) => void): void;
<A,B,C,D,E,F,G,H,I,J,K,O,P,Q>(fn: (p0: O, p1: P, p2: Q, callback: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I, j: J, k: K) => any) => any, p0: O, p1: P, p2: Q, callback: (a: A, b: B | null | undefined, priorErrorsOrC: C | A[] | undefined, d: D | undefined, e: E | undefined, f: F | undefined, g: G | undefined, h: H | undefined, i: I | undefined, j: J | undefined, k: K | undefined) => void): void;
<A,B,C,D,E,F,G,H,I,J,K,O,P,Q,R>(fn: (p0: O, p1: P, p2: Q, p3: R, callback: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I, j: J, k: K) => any) => any, p0: O, p1: P, p2: Q, p3: R, intermediate: BackoffIntermediate<A>, callback: (a: A, b: B | null | undefined, priorErrorsOrC: C | A[] | undefined, d: D | undefined, e: E | undefined, f: F | undefined, g: G | undefined, h: H | undefined, i: I | undefined, j: J | undefined, k: K | undefined) => void): void;
<A,B,C,D,E,F,G,H,I,J,K,O,P,Q,R>(fn: (p0: O, p1: P, p2: Q, p3: R, callback: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I, j: J, k: K) => any) => any, p0: O, p1: P, p2: Q, p3: R, callback: (a: A, b: B | null | undefined, priorErrorsOrC: C | A[] | undefined, d: D | undefined, e: E | undefined, f: F | undefined, g: G | undefined, h: H | undefined, i: I | undefined, j: J | undefined, k: K | undefined) => void): void;
<A,B,C,D,E,F,G,H,I,J,K,O,P,Q,R,S>(fn: (p0: O, p1: P, p2: Q, p3: R, p4: S, callback: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I, j: J, k: K) => any) => any, p0: O, p1: P, p2: Q, p3: R, p4: S, intermediate: BackoffIntermediate<A>, callback: (a: A, b: B | null | undefined, priorErrorsOrC: C | A[] | undefined, d: D | undefined, e: E | undefined, f: F | undefined, g: G | undefined, h: H | undefined, i: I | undefined, j: J | undefined, k: K | undefined) => void): void;
<A,B,C,D,E,F,G,H,I,J,K,O,P,Q,R,S>(fn: (p0: O, p1: P, p2: Q, p3: R, p4: S, callback: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I, j: J, k: K) => any) => any, p0: O, p1: P, p2: Q, p3: R, p4: S, callback: (a: A, b: B | null | undefined, priorErrorsOrC: C | A[] | undefined, d: D | undefined, e: E | undefined, f: F | undefined, g: G | undefined, h: H | undefined, i: I | undefined, j: J | undefined, k: K | undefined) => void): void;
<A,B,C,D,E,F,G,H,I,J,K,O,P,Q,R,S,T>(fn: (p0: O, p1: P, p2: Q, p3: R, p4: S, p5: T, callback: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I, j: J, k: K) => any) => any, p0: O, p1: P, p2: Q, p3: R, p4: S, p5: T, intermediate: BackoffIntermediate<A>, callback: (a: A, b: B | null | undefined, priorErrorsOrC: C | A[] | undefined, d: D | undefined, e: E | undefined, f: F | undefined, g: G | undefined, h: H | undefined, i: I | undefined, j: J | undefined, k: K | undefined) => void): void;
<A,B,C,D,E,F,G,H,I,J,K,O,P,Q,R,S,T>(fn: (p0: O, p1: P, p2: Q, p3: R, p4: S, p5: T, callback: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I, j: J, k: K) => any) => any, p0: O, p1: P, p2: Q, p3: R, p4: S, p5: T, callback: (a: A, b: B | null | undefined, priorErrorsOrC: C | A[] | undefined, d: D | undefined, e: E | undefined, f: F | undefined, g: G | undefined, h: H | undefined, i: I | undefined, j: J | undefined, k: K | undefined) => void): void;
<A,B,C,D,E,F,G,H,I,J,K,O,P,Q,R,S,T,U>(fn: (p0: O, p1: P, p2: Q, p3: R, p4: S, p5: T, p6: U, callback: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I, j: J, k: K) => any) => any, p0: O, p1: P, p2: Q, p3: R, p4: S, p5: T, p6: U, intermediate: BackoffIntermediate<A>, callback: (a: A, b: B | null | undefined, priorErrorsOrC: C | A[] | undefined, d: D | undefined, e: E | undefined, f: F | undefined, g: G | undefined, h: H | undefined, i: I | undefined, j: J | undefined, k: K | undefined) => void): void;
<A,B,C,D,E,F,G,H,I,J,K,O,P,Q,R,S,T,U>(fn: (p0: O, p1: P, p2: Q, p3: R, p4: S, p5: T, p6: U, callback: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I, j: J, k: K) => any) => any, p0: O, p1: P, p2: Q, p3: R, p4: S, p5: T, p6: U, callback: (a: A, b: B | null | undefined, priorErrorsOrC: C | A[] | undefined, d: D | undefined, e: E | undefined, f: F | undefined, g: G | undefined, h: H | undefined, i: I | undefined, j: J | undefined, k: K | undefined) => void): void;
<A,B,C,D,E,F,G,H,I,J,K,O,P,Q,R,S,T,U,V>(fn: (p0: O, p1: P, p2: Q, p3: R, p4: S, p5: T, p6: U, p7: V, callback: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I, j: J, k: K) => any) => any, p0: O, p1: P, p2: Q, p3: R, p4: S, p5: T, p6: U, p7: V, intermediate: BackoffIntermediate<A>, callback: (a: A, b: B | null | undefined, priorErrorsOrC: C | A[] | undefined, d: D | undefined, e: E | undefined, f: F | undefined, g: G | undefined, h: H | undefined, i: I | undefined, j: J | undefined, k: K | undefined) => void): void;
<A,B,C,D,E,F,G,H,I,J,K,O,P,Q,R,S,T,U,V>(fn: (p0: O, p1: P, p2: Q, p3: R, p4: S, p5: T, p6: U, p7: V, callback: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I, j: J, k: K) => any) => any, p0: O, p1: P, p2: Q, p3: R, p4: S, p5: T, p6: U, p7: V, callback: (a: A, b: B | null | undefined, priorErrorsOrC: C | A[] | undefined, d: D | undefined, e: E | undefined, f: F | undefined, g: G | undefined, h: H | undefined, i: I | undefined, j: J | undefined, k: K | undefined) => void): void;
<A,B,C,D,E,F,G,H,I,J,K,O,P,Q,R,S,T,U,V,W>(fn: (p0: O, p1: P, p2: Q, p3: R, p4: S, p5: T, p6: U, p7: V, p8: W, callback: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I, j: J, k: K) => any) => any, p0: O, p1: P, p2: Q, p3: R, p4: S, p5: T, p6: U, p7: V, p8: W, intermediate: BackoffIntermediate<A>, callback: (a: A, b: B | null | undefined, priorErrorsOrC: C | A[] | undefined, d: D | undefined, e: E | undefined, f: F | undefined, g: G | undefined, h: H | undefined, i: I | undefined, j: J | undefined, k: K | undefined) => void): void;
<A,B,C,D,E,F,G,H,I,J,K,O,P,Q,R,S,T,U,V,W>(fn: (p0: O, p1: P, p2: Q, p3: R, p4: S, p5: T, p6: U, p7: V, p8: W, callback: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I, j: J, k: K) => any) => any, p0: O, p1: P, p2: Q, p3: R, p4: S, p5: T, p6: U, p7: V, p8: W, callback: (a: A, b: B | null | undefined, priorErrorsOrC: C | A[] | undefined, d: D | undefined, e: E | undefined, f: F | undefined, g: G | undefined, h: H | undefined, i: I | undefined, j: J | undefined, k: K | undefined) => void): void;
<A,B,C,D,E,F,G,H,I,J,K,O,P,Q,R,S,T,U,V,W,X>(fn: (p0: O, p1: P, p2: Q, p3: R, p4: S, p5: T, p6: U, p7: V, p8: W, p9: X, callback: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I, j: J, k: K) => any) => any, p0: O, p1: P, p2: Q, p3: R, p4: S, p5: T, p6: U, p7: V, p8: W, p9: X, intermediate: BackoffIntermediate<A>, callback: (a: A, b: B | null | undefined, priorErrorsOrC: C | A[] | undefined, d: D | undefined, e: E | undefined, f: F | undefined, g: G | undefined, h: H | undefined, i: I | undefined, j: J | undefined, k: K | undefined) => void): void;
<A,B,C,D,E,F,G,H,I,J,K,O,P,Q,R,S,T,U,V,W,X>(fn: (p0: O, p1: P, p2: Q, p3: R, p4: S, p5: T, p6: U, p7: V, p8: W, p9: X, callback: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I, j: J, k: K) => any) => any, p0: O, p1: P, p2: Q, p3: R, p4: S, p5: T, p6: U, p7: V, p8: W, p9: X, callback: (a: A, b: B | null | undefined, priorErrorsOrC: C | A[] | undefined, d: D | undefined, e: E | undefined, f: F | undefined, g: G | undefined, h: H | undefined, i: I | undefined, j: J | undefined, k: K | undefined) => void): void;
<A,B,C,D,E,F,G,H,I,J,K,O,P,Q,R,S,T,U,V,W,X,Y>(fn: (p0: O, p1: P, p2: Q, p3: R, p4: S, p5: T, p6: U, p7: V, p8: W, p9: X, p10: Y, callback: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I, j: J, k: K) => any) => any, p0: O, p1: P, p2: Q, p3: R, p4: S, p5: T, p6: U, p7: V, p8: W, p9: X, p10: Y, intermediate: BackoffIntermediate<A>, callback: (a: A, b: B | null | undefined, priorErrorsOrC: C | A[] | undefined, d: D | undefined, e: E | undefined, f: F | undefined, g: G | undefined, h: H | undefined, i: I | undefined, j: J | undefined, k: K | undefined) => void): void;
<A,B,C,D,E,F,G,H,I,J,K,O,P,Q,R,S,T,U,V,W,X,Y>(fn: (p0: O, p1: P, p2: Q, p3: R, p4: S, p5: T, p6: U, p7: V, p8: W, p9: X, p10: Y, callback: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I, j: J, k: K) => any) => any, p0: O, p1: P, p2: Q, p3: R, p4: S, p5: T, p6: U, p7: V, p8: W, p9: X, p10: Y, callback: (a: A, b: B | null | undefined, priorErrorsOrC: C | A[] | undefined, d: D | undefined, e: E | undefined, f: F | undefined, g: G | undefined, h: H | undefined, i: I | undefined, j: J | undefined, k: K | undefined) => void): void;
<A,B,C,D,E,F,G,H,I,J,K,O,P,Q,R,S,T,U,V,W,X,Y,Z>(fn: (p0: O, p1: P, p2: Q, p3: R, p4: S, p5: T, p6: U, p7: V, p8: W, p9: X, p10: Y, p11: Z, callback: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I, j: J, k: K) => any) => any, p0: O, p1: P, p2: Q, p3: R, p4: S, p5: T, p6: U, p7: V, p8: W, p9: X, p10: Y, p11: Z, intermediate: BackoffIntermediate<A>, callback: (a: A, b: B | null | undefined, priorErrorsOrC: C | A[] | undefined, d: D | undefined, e: E | undefined, f: F | undefined, g: G | undefined, h: H | undefined, i: I | undefined, j: J | undefined, k: K | undefined) => void): void;
<A,B,C,D,E,F,G,H,I,J,K,O,P,Q,R,S,T,U,V,W,X,Y,Z>(fn: (p0: O, p1: P, p2: Q, p3: R, p4: S, p5: T, p6: U, p7: V, p8: W, p9: X, p10: Y, p11: Z, callback: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I, j: J, k: K) => any) => any, p0: O, p1: P, p2: Q, p3: R, p4: S, p5: T, p6: U, p7: V, p8: W, p9: X, p10: Y, p11: Z, callback: (a: A, b: B | null | undefined, priorErrorsOrC: C | A[] | undefined, d: D | undefined, e: E | undefined, f: F | undefined, g: G | undefined, h: H | undefined, i: I | undefined, j: J | undefined, k: K | undefined) => void): void;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment