import {Number} from '../Number/Number'

/** Describes a map of number relationships
 * (Generated with "./_Internal/IterationOfGenerator")
 */
export type IterationMap = {
    '-40': ['__', '-39', '-40', -40, '-'],
    '-39': ['-40', '-38', '-39', -39, '-'],
    '-38': ['-39', '-37', '-38', -38, '-'],
    '-37': ['-38', '-36', '-37', -37, '-'],
    '-36': ['-37', '-35', '-36', -36, '-'],
    '-35': ['-36', '-34', '-35', -35, '-'],
    '-34': ['-35', '-33', '-34', -34, '-'],
    '-33': ['-34', '-32', '-33', -33, '-'],
    '-32': ['-33', '-31', '-32', -32, '-'],
    '-31': ['-32', '-30', '-31', -31, '-'],
    '-30': ['-31', '-29', '-30', -30, '-'],
    '-29': ['-30', '-28', '-29', -29, '-'],
    '-28': ['-29', '-27', '-28', -28, '-'],
    '-27': ['-28', '-26', '-27', -27, '-'],
    '-26': ['-27', '-25', '-26', -26, '-'],
    '-25': ['-26', '-24', '-25', -25, '-'],
    '-24': ['-25', '-23', '-24', -24, '-'],
    '-23': ['-24', '-22', '-23', -23, '-'],
    '-22': ['-23', '-21', '-22', -22, '-'],
    '-21': ['-22', '-20', '-21', -21, '-'],
    '-20': ['-21', '-19', '-20', -20, '-'],
    '-19': ['-20', '-18', '-19', -19, '-'],
    '-18': ['-19', '-17', '-18', -18, '-'],
    '-17': ['-18', '-16', '-17', -17, '-'],
    '-16': ['-17', '-15', '-16', -16, '-'],
    '-15': ['-16', '-14', '-15', -15, '-'],
    '-14': ['-15', '-13', '-14', -14, '-'],
    '-13': ['-14', '-12', '-13', -13, '-'],
    '-12': ['-13', '-11', '-12', -12, '-'],
    '-11': ['-12', '-10', '-11', -11, '-'],
    '-10': ['-11', '-9', '-10', -10, '-'],
    '-9' : ['-10', '-8', '-9', -9, '-'],
    '-8' : ['-9', '-7', '-8', -8, '-'],
    '-7' : ['-8', '-6', '-7', -7, '-'],
    '-6' : ['-7', '-5', '-6', -6, '-'],
    '-5' : ['-6', '-4', '-5', -5, '-'],
    '-4' : ['-5', '-3', '-4', -4, '-'],
    '-3' : ['-4', '-2', '-3', -3, '-'],
    '-2' : ['-3', '-1', '-2', -2, '-'],
    '-1' : ['-2', '0', '-1', -1, '-'],
    '0'  : ['-1', '1', '0', 0, '0']
    '1'  : ['0', '2', '1', 1, '+'],
    '2'  : ['1', '3', '2', 2, '+'],
    '3'  : ['2', '4', '3', 3, '+'],
    '4'  : ['3', '5', '4', 4, '+'],
    '5'  : ['4', '6', '5', 5, '+'],
    '6'  : ['5', '7', '6', 6, '+'],
    '7'  : ['6', '8', '7', 7, '+'],
    '8'  : ['7', '9', '8', 8, '+'],
    '9'  : ['8', '10', '9', 9, '+'],
    '10' : ['9', '11', '10', 10, '+'],
    '11' : ['10', '12', '11', 11, '+'],
    '12' : ['11', '13', '12', 12, '+'],
    '13' : ['12', '14', '13', 13, '+'],
    '14' : ['13', '15', '14', 14, '+'],
    '15' : ['14', '16', '15', 15, '+'],
    '16' : ['15', '17', '16', 16, '+'],
    '17' : ['16', '18', '17', 17, '+'],
    '18' : ['17', '19', '18', 18, '+'],
    '19' : ['18', '20', '19', 19, '+'],
    '20' : ['19', '21', '20', 20, '+'],
    '21' : ['20', '22', '21', 21, '+'],
    '22' : ['21', '23', '22', 22, '+'],
    '23' : ['22', '24', '23', 23, '+'],
    '24' : ['23', '25', '24', 24, '+'],
    '25' : ['24', '26', '25', 25, '+'],
    '26' : ['25', '27', '26', 26, '+'],
    '27' : ['26', '28', '27', 27, '+'],
    '28' : ['27', '29', '28', 28, '+'],
    '29' : ['28', '30', '29', 29, '+'],
    '30' : ['29', '31', '30', 30, '+'],
    '31' : ['30', '32', '31', 31, '+'],
    '32' : ['31', '33', '32', 32, '+'],
    '33' : ['32', '34', '33', 33, '+'],
    '34' : ['33', '35', '34', 34, '+'],
    '35' : ['34', '36', '35', 35, '+'],
    '36' : ['35', '37', '36', 36, '+'],
    '37' : ['36', '38', '37', 37, '+'],
    '38' : ['37', '39', '38', 38, '+'],
    '39' : ['38', '40', '39', 39, '+'],
    '40' : ['39', '__', '40', 40, '+'],
    '__' : ['__', '__', string, number, '-' | '0' | '+']
}

/** Transform a number into an **`Iteration`**
 * (to use **`Prev`**, **`Next`**, & **`Pos`**)
 * @param N to transform
 * @returns **`Iteration`**
 * @example
 * ```ts
 * import {I} from 'ts-toolbelt'
 *
 * type i = I.IterationOf<'0'> // ["-1", "1", "0", 0, "0"]
 *
 * type next = I.Next<i>       // ["0", "2", "1", 1, "+"]
 * type prev = I.Prev<i>       // ["-2", "0", "-1", -1, "-"]
 *
 * type nnext = I.Pos<next>    // +1
 * type nprev = I.Pos<prev>    // -1
 * ```
 */
export type IterationOf<N extends Number> =
    N extends keyof IterationMap
    ? IterationMap[N]
    : IterationMap['__']
