Skip to content

Instantly share code, notes, and snippets.

@geoffreak
Created September 25, 2016 03:37
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/8ac60f3f995f56401c862bc58b447817 to your computer and use it in GitHub Desktop.
Save geoffreak/8ac60f3f995f56401c862bc58b447817 to your computer and use it in GitHub Desktop.
Oibackoff typing that works thanks to a bug that makes things simpler!
import * as fs from 'fs';
// Settings
let generics = ['a','b'];
let maxParameters = 10;
let maxCallbackParameters = 2;
let parameterName = 'data';
// File
let fileStream = fs.createWriteStream('index.d.ts');
// Generate the instance
let lines: string[] = [];
for (let maxGeneric = 1; maxGeneric <= generics.length; maxGeneric++) {
let genericNotation = `<${generics.slice(0, maxGeneric).map(v => v.toUpperCase()).join(',')}>`;
let functionCallbackNotation = `callback: (${generics.slice(0, maxGeneric).map(v => `${v}: ${v.toUpperCase()}`).join(', ')}) => any`;
let callbackNotation = `callback: (${generics.slice(0, maxGeneric).map(v => `${v}: ${v.toUpperCase()}`).join(', ')}, ${maxGeneric < 2 ? 'data: null, ' : ''}priorErrors?: ${generics[0].toUpperCase()}[]) => void`;
// Loop through each allowed amount of backoff parameters
for (let maxBackoffParamNumber = 0; maxBackoffParamNumber < maxParameters; maxBackoffParamNumber++) {
// Build the list of backoff parameters
let backoffParams: string[] = [];
for (let backoffParamNumber = 0; backoffParamNumber < maxBackoffParamNumber; backoffParamNumber++) {
backoffParams.push(`${parameterName}${backoffParamNumber}: any`)
}
// Loop through each allowed amount of callback parameters
for (let maxCallbackParamNumber = 0; maxCallbackParamNumber < maxCallbackParameters; maxCallbackParamNumber++) {
// Build the list of callback parameters
let callbackParams: string[] = [];
for (let callbackParamNumber = 0; callbackParamNumber < maxCallbackParamNumber; callbackParamNumber++) {
callbackParams.push(`${parameterName}${callbackParamNumber}: any`)
}
callbackParams.push(functionCallbackNotation);
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>(fn: (callback: (a: A) => any) => any, intermediate: BackoffIntermediate<A>, callback: (a: A, data: null, priorErrors?: A[]) => void): void;
<A>(fn: (callback: (a: A) => any) => any, callback: (a: A, data: null, priorErrors?: A[]) => void): void;
<A>(fn: (data0: any, callback: (a: A) => any) => any, intermediate: BackoffIntermediate<A>, callback: (a: A, data: null, priorErrors?: A[]) => void): void;
<A>(fn: (data0: any, callback: (a: A) => any) => any, callback: (a: A, data: null, priorErrors?: A[]) => void): void;
<A>(fn: (callback: (a: A) => any) => any, data0: any, intermediate: BackoffIntermediate<A>, callback: (a: A, data: null, priorErrors?: A[]) => void): void;
<A>(fn: (callback: (a: A) => any) => any, data0: any, callback: (a: A, data: null, priorErrors?: A[]) => void): void;
<A>(fn: (data0: any, callback: (a: A) => any) => any, data0: any, intermediate: BackoffIntermediate<A>, callback: (a: A, data: null, priorErrors?: A[]) => void): void;
<A>(fn: (data0: any, callback: (a: A) => any) => any, data0: any, callback: (a: A, data: null, priorErrors?: A[]) => void): void;
<A>(fn: (callback: (a: A) => any) => any, data0: any, data1: any, intermediate: BackoffIntermediate<A>, callback: (a: A, data: null, priorErrors?: A[]) => void): void;
<A>(fn: (callback: (a: A) => any) => any, data0: any, data1: any, callback: (a: A, data: null, priorErrors?: A[]) => void): void;
<A>(fn: (data0: any, callback: (a: A) => any) => any, data0: any, data1: any, intermediate: BackoffIntermediate<A>, callback: (a: A, data: null, priorErrors?: A[]) => void): void;
<A>(fn: (data0: any, callback: (a: A) => any) => any, data0: any, data1: any, callback: (a: A, data: null, priorErrors?: A[]) => void): void;
<A>(fn: (callback: (a: A) => any) => any, data0: any, data1: any, data2: any, intermediate: BackoffIntermediate<A>, callback: (a: A, data: null, priorErrors?: A[]) => void): void;
<A>(fn: (callback: (a: A) => any) => any, data0: any, data1: any, data2: any, callback: (a: A, data: null, priorErrors?: A[]) => void): void;
<A>(fn: (data0: any, callback: (a: A) => any) => any, data0: any, data1: any, data2: any, intermediate: BackoffIntermediate<A>, callback: (a: A, data: null, priorErrors?: A[]) => void): void;
<A>(fn: (data0: any, callback: (a: A) => any) => any, data0: any, data1: any, data2: any, callback: (a: A, data: null, priorErrors?: A[]) => void): void;
<A>(fn: (callback: (a: A) => any) => any, data0: any, data1: any, data2: any, data3: any, intermediate: BackoffIntermediate<A>, callback: (a: A, data: null, priorErrors?: A[]) => void): void;
<A>(fn: (callback: (a: A) => any) => any, data0: any, data1: any, data2: any, data3: any, callback: (a: A, data: null, priorErrors?: A[]) => void): void;
<A>(fn: (data0: any, callback: (a: A) => any) => any, data0: any, data1: any, data2: any, data3: any, intermediate: BackoffIntermediate<A>, callback: (a: A, data: null, priorErrors?: A[]) => void): void;
<A>(fn: (data0: any, callback: (a: A) => any) => any, data0: any, data1: any, data2: any, data3: any, callback: (a: A, data: null, priorErrors?: A[]) => void): void;
<A>(fn: (callback: (a: A) => any) => any, data0: any, data1: any, data2: any, data3: any, data4: any, intermediate: BackoffIntermediate<A>, callback: (a: A, data: null, priorErrors?: A[]) => void): void;
<A>(fn: (callback: (a: A) => any) => any, data0: any, data1: any, data2: any, data3: any, data4: any, callback: (a: A, data: null, priorErrors?: A[]) => void): void;
<A>(fn: (data0: any, callback: (a: A) => any) => any, data0: any, data1: any, data2: any, data3: any, data4: any, intermediate: BackoffIntermediate<A>, callback: (a: A, data: null, priorErrors?: A[]) => void): void;
<A>(fn: (data0: any, callback: (a: A) => any) => any, data0: any, data1: any, data2: any, data3: any, data4: any, callback: (a: A, data: null, priorErrors?: A[]) => void): void;
<A>(fn: (callback: (a: A) => any) => any, data0: any, data1: any, data2: any, data3: any, data4: any, data5: any, intermediate: BackoffIntermediate<A>, callback: (a: A, data: null, priorErrors?: A[]) => void): void;
<A>(fn: (callback: (a: A) => any) => any, data0: any, data1: any, data2: any, data3: any, data4: any, data5: any, callback: (a: A, data: null, priorErrors?: A[]) => void): void;
<A>(fn: (data0: any, callback: (a: A) => any) => any, data0: any, data1: any, data2: any, data3: any, data4: any, data5: any, intermediate: BackoffIntermediate<A>, callback: (a: A, data: null, priorErrors?: A[]) => void): void;
<A>(fn: (data0: any, callback: (a: A) => any) => any, data0: any, data1: any, data2: any, data3: any, data4: any, data5: any, callback: (a: A, data: null, priorErrors?: A[]) => void): void;
<A>(fn: (callback: (a: A) => any) => any, data0: any, data1: any, data2: any, data3: any, data4: any, data5: any, data6: any, intermediate: BackoffIntermediate<A>, callback: (a: A, data: null, priorErrors?: A[]) => void): void;
<A>(fn: (callback: (a: A) => any) => any, data0: any, data1: any, data2: any, data3: any, data4: any, data5: any, data6: any, callback: (a: A, data: null, priorErrors?: A[]) => void): void;
<A>(fn: (data0: any, callback: (a: A) => any) => any, data0: any, data1: any, data2: any, data3: any, data4: any, data5: any, data6: any, intermediate: BackoffIntermediate<A>, callback: (a: A, data: null, priorErrors?: A[]) => void): void;
<A>(fn: (data0: any, callback: (a: A) => any) => any, data0: any, data1: any, data2: any, data3: any, data4: any, data5: any, data6: any, callback: (a: A, data: null, priorErrors?: A[]) => void): void;
<A>(fn: (callback: (a: A) => any) => any, data0: any, data1: any, data2: any, data3: any, data4: any, data5: any, data6: any, data7: any, intermediate: BackoffIntermediate<A>, callback: (a: A, data: null, priorErrors?: A[]) => void): void;
<A>(fn: (callback: (a: A) => any) => any, data0: any, data1: any, data2: any, data3: any, data4: any, data5: any, data6: any, data7: any, callback: (a: A, data: null, priorErrors?: A[]) => void): void;
<A>(fn: (data0: any, callback: (a: A) => any) => any, data0: any, data1: any, data2: any, data3: any, data4: any, data5: any, data6: any, data7: any, intermediate: BackoffIntermediate<A>, callback: (a: A, data: null, priorErrors?: A[]) => void): void;
<A>(fn: (data0: any, callback: (a: A) => any) => any, data0: any, data1: any, data2: any, data3: any, data4: any, data5: any, data6: any, data7: any, callback: (a: A, data: null, priorErrors?: A[]) => void): void;
<A>(fn: (callback: (a: A) => any) => any, data0: any, data1: any, data2: any, data3: any, data4: any, data5: any, data6: any, data7: any, data8: any, intermediate: BackoffIntermediate<A>, callback: (a: A, data: null, priorErrors?: A[]) => void): void;
<A>(fn: (callback: (a: A) => any) => any, data0: any, data1: any, data2: any, data3: any, data4: any, data5: any, data6: any, data7: any, data8: any, callback: (a: A, data: null, priorErrors?: A[]) => void): void;
<A>(fn: (data0: any, callback: (a: A) => any) => any, data0: any, data1: any, data2: any, data3: any, data4: any, data5: any, data6: any, data7: any, data8: any, intermediate: BackoffIntermediate<A>, callback: (a: A, data: null, priorErrors?: A[]) => void): void;
<A>(fn: (data0: any, callback: (a: A) => any) => any, data0: any, data1: any, data2: any, data3: any, data4: any, data5: any, data6: any, data7: any, data8: any, callback: (a: A, data: null, priorErrors?: A[]) => void): void;
<A,B>(fn: (callback: (a: A, b: B) => any) => any, intermediate: BackoffIntermediate<A>, callback: (a: A, b: B, priorErrors?: A[]) => void): void;
<A,B>(fn: (callback: (a: A, b: B) => any) => any, callback: (a: A, b: B, priorErrors?: A[]) => void): void;
<A,B>(fn: (data0: any, callback: (a: A, b: B) => any) => any, intermediate: BackoffIntermediate<A>, callback: (a: A, b: B, priorErrors?: A[]) => void): void;
<A,B>(fn: (data0: any, callback: (a: A, b: B) => any) => any, callback: (a: A, b: B, priorErrors?: A[]) => void): void;
<A,B>(fn: (callback: (a: A, b: B) => any) => any, data0: any, intermediate: BackoffIntermediate<A>, callback: (a: A, b: B, priorErrors?: A[]) => void): void;
<A,B>(fn: (callback: (a: A, b: B) => any) => any, data0: any, callback: (a: A, b: B, priorErrors?: A[]) => void): void;
<A,B>(fn: (data0: any, callback: (a: A, b: B) => any) => any, data0: any, intermediate: BackoffIntermediate<A>, callback: (a: A, b: B, priorErrors?: A[]) => void): void;
<A,B>(fn: (data0: any, callback: (a: A, b: B) => any) => any, data0: any, callback: (a: A, b: B, priorErrors?: A[]) => void): void;
<A,B>(fn: (callback: (a: A, b: B) => any) => any, data0: any, data1: any, intermediate: BackoffIntermediate<A>, callback: (a: A, b: B, priorErrors?: A[]) => void): void;
<A,B>(fn: (callback: (a: A, b: B) => any) => any, data0: any, data1: any, callback: (a: A, b: B, priorErrors?: A[]) => void): void;
<A,B>(fn: (data0: any, callback: (a: A, b: B) => any) => any, data0: any, data1: any, intermediate: BackoffIntermediate<A>, callback: (a: A, b: B, priorErrors?: A[]) => void): void;
<A,B>(fn: (data0: any, callback: (a: A, b: B) => any) => any, data0: any, data1: any, callback: (a: A, b: B, priorErrors?: A[]) => void): void;
<A,B>(fn: (callback: (a: A, b: B) => any) => any, data0: any, data1: any, data2: any, intermediate: BackoffIntermediate<A>, callback: (a: A, b: B, priorErrors?: A[]) => void): void;
<A,B>(fn: (callback: (a: A, b: B) => any) => any, data0: any, data1: any, data2: any, callback: (a: A, b: B, priorErrors?: A[]) => void): void;
<A,B>(fn: (data0: any, callback: (a: A, b: B) => any) => any, data0: any, data1: any, data2: any, intermediate: BackoffIntermediate<A>, callback: (a: A, b: B, priorErrors?: A[]) => void): void;
<A,B>(fn: (data0: any, callback: (a: A, b: B) => any) => any, data0: any, data1: any, data2: any, callback: (a: A, b: B, priorErrors?: A[]) => void): void;
<A,B>(fn: (callback: (a: A, b: B) => any) => any, data0: any, data1: any, data2: any, data3: any, intermediate: BackoffIntermediate<A>, callback: (a: A, b: B, priorErrors?: A[]) => void): void;
<A,B>(fn: (callback: (a: A, b: B) => any) => any, data0: any, data1: any, data2: any, data3: any, callback: (a: A, b: B, priorErrors?: A[]) => void): void;
<A,B>(fn: (data0: any, callback: (a: A, b: B) => any) => any, data0: any, data1: any, data2: any, data3: any, intermediate: BackoffIntermediate<A>, callback: (a: A, b: B, priorErrors?: A[]) => void): void;
<A,B>(fn: (data0: any, callback: (a: A, b: B) => any) => any, data0: any, data1: any, data2: any, data3: any, callback: (a: A, b: B, priorErrors?: A[]) => void): void;
<A,B>(fn: (callback: (a: A, b: B) => any) => any, data0: any, data1: any, data2: any, data3: any, data4: any, intermediate: BackoffIntermediate<A>, callback: (a: A, b: B, priorErrors?: A[]) => void): void;
<A,B>(fn: (callback: (a: A, b: B) => any) => any, data0: any, data1: any, data2: any, data3: any, data4: any, callback: (a: A, b: B, priorErrors?: A[]) => void): void;
<A,B>(fn: (data0: any, callback: (a: A, b: B) => any) => any, data0: any, data1: any, data2: any, data3: any, data4: any, intermediate: BackoffIntermediate<A>, callback: (a: A, b: B, priorErrors?: A[]) => void): void;
<A,B>(fn: (data0: any, callback: (a: A, b: B) => any) => any, data0: any, data1: any, data2: any, data3: any, data4: any, callback: (a: A, b: B, priorErrors?: A[]) => void): void;
<A,B>(fn: (callback: (a: A, b: B) => any) => any, data0: any, data1: any, data2: any, data3: any, data4: any, data5: any, intermediate: BackoffIntermediate<A>, callback: (a: A, b: B, priorErrors?: A[]) => void): void;
<A,B>(fn: (callback: (a: A, b: B) => any) => any, data0: any, data1: any, data2: any, data3: any, data4: any, data5: any, callback: (a: A, b: B, priorErrors?: A[]) => void): void;
<A,B>(fn: (data0: any, callback: (a: A, b: B) => any) => any, data0: any, data1: any, data2: any, data3: any, data4: any, data5: any, intermediate: BackoffIntermediate<A>, callback: (a: A, b: B, priorErrors?: A[]) => void): void;
<A,B>(fn: (data0: any, callback: (a: A, b: B) => any) => any, data0: any, data1: any, data2: any, data3: any, data4: any, data5: any, callback: (a: A, b: B, priorErrors?: A[]) => void): void;
<A,B>(fn: (callback: (a: A, b: B) => any) => any, data0: any, data1: any, data2: any, data3: any, data4: any, data5: any, data6: any, intermediate: BackoffIntermediate<A>, callback: (a: A, b: B, priorErrors?: A[]) => void): void;
<A,B>(fn: (callback: (a: A, b: B) => any) => any, data0: any, data1: any, data2: any, data3: any, data4: any, data5: any, data6: any, callback: (a: A, b: B, priorErrors?: A[]) => void): void;
<A,B>(fn: (data0: any, callback: (a: A, b: B) => any) => any, data0: any, data1: any, data2: any, data3: any, data4: any, data5: any, data6: any, intermediate: BackoffIntermediate<A>, callback: (a: A, b: B, priorErrors?: A[]) => void): void;
<A,B>(fn: (data0: any, callback: (a: A, b: B) => any) => any, data0: any, data1: any, data2: any, data3: any, data4: any, data5: any, data6: any, callback: (a: A, b: B, priorErrors?: A[]) => void): void;
<A,B>(fn: (callback: (a: A, b: B) => any) => any, data0: any, data1: any, data2: any, data3: any, data4: any, data5: any, data6: any, data7: any, intermediate: BackoffIntermediate<A>, callback: (a: A, b: B, priorErrors?: A[]) => void): void;
<A,B>(fn: (callback: (a: A, b: B) => any) => any, data0: any, data1: any, data2: any, data3: any, data4: any, data5: any, data6: any, data7: any, callback: (a: A, b: B, priorErrors?: A[]) => void): void;
<A,B>(fn: (data0: any, callback: (a: A, b: B) => any) => any, data0: any, data1: any, data2: any, data3: any, data4: any, data5: any, data6: any, data7: any, intermediate: BackoffIntermediate<A>, callback: (a: A, b: B, priorErrors?: A[]) => void): void;
<A,B>(fn: (data0: any, callback: (a: A, b: B) => any) => any, data0: any, data1: any, data2: any, data3: any, data4: any, data5: any, data6: any, data7: any, callback: (a: A, b: B, priorErrors?: A[]) => void): void;
<A,B>(fn: (callback: (a: A, b: B) => any) => any, data0: any, data1: any, data2: any, data3: any, data4: any, data5: any, data6: any, data7: any, data8: any, intermediate: BackoffIntermediate<A>, callback: (a: A, b: B, priorErrors?: A[]) => void): void;
<A,B>(fn: (callback: (a: A, b: B) => any) => any, data0: any, data1: any, data2: any, data3: any, data4: any, data5: any, data6: any, data7: any, data8: any, callback: (a: A, b: B, priorErrors?: A[]) => void): void;
<A,B>(fn: (data0: any, callback: (a: A, b: B) => any) => any, data0: any, data1: any, data2: any, data3: any, data4: any, data5: any, data6: any, data7: any, data8: any, intermediate: BackoffIntermediate<A>, callback: (a: A, b: B, priorErrors?: A[]) => void): void;
<A,B>(fn: (data0: any, callback: (a: A, b: B) => any) => any, data0: any, data1: any, data2: any, data3: any, data4: any, data5: any, data6: any, data7: any, data8: any, callback: (a: A, b: B, priorErrors?: A[]) => void): void;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment