Created
September 25, 2016 03:37
-
-
Save geoffreak/8ac60f3f995f56401c862bc58b447817 to your computer and use it in GitHub Desktop.
Oibackoff typing that works thanks to a bug that makes things simpler!
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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`); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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