UNPKG

@tonaljs/array

Version:

Functions to work with arrays of tonal objects

1 lines 5.47 kB
{"version":3,"sources":["../index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { note, Note } from \"@tonaljs/pitch-note\";\n\n// ascending range\nfunction ascR(b: number, n: number) {\n const a = [];\n // tslint:disable-next-line:curly\n for (; n--; a[n] = n + b);\n return a;\n}\n// descending range\nfunction descR(b: number, n: number) {\n const a = [];\n // tslint:disable-next-line:curly\n for (; n--; a[n] = b - n);\n return a;\n}\n\n/**\n * Creates a numeric range\n *\n * @param {number} from\n * @param {number} to\n * @return {Array<number>}\n *\n * @example\n * range(-2, 2) // => [-2, -1, 0, 1, 2]\n * range(2, -2) // => [2, 1, 0, -1, -2]\n */\nexport function range(from: number, to: number): number[] {\n return from < to ? ascR(from, to - from + 1) : descR(from, from - to + 1);\n}\n\n/**\n * Rotates a list a number of times. It's completely agnostic about the\n * contents of the list.\n *\n * @param {Integer} times - the number of rotations\n * @param {Array} array\n * @return {Array} the rotated array\n *\n * @example\n * rotate(1, [1, 2, 3]) // => [2, 3, 1]\n */\nexport function rotate<T>(times: number, arr: T[]): T[] {\n const len = arr.length;\n const n = ((times % len) + len) % len;\n return arr.slice(n, len).concat(arr.slice(0, n));\n}\n\n/**\n * Return a copy of the array with the null values removed\n * @function\n * @param {Array} array\n * @return {Array}\n *\n * @example\n * compact([\"a\", \"b\", null, \"c\"]) // => [\"a\", \"b\", \"c\"]\n */\nexport function compact(arr: any[]): any[] {\n return arr.filter((n) => n === 0 || n);\n}\n\n/**\n * Sort an array of notes in ascending order. Pitch classes are listed\n * before notes. Any string that is not a note is removed.\n *\n * @param {string[]} notes\n * @return {string[]} sorted array of notes\n *\n * @example\n * sortedNoteNames(['c2', 'c5', 'c1', 'c0', 'c6', 'c'])\n * // => ['C', 'C0', 'C1', 'C2', 'C5', 'C6']\n * sortedNoteNames(['c', 'F', 'G', 'a', 'b', 'h', 'J'])\n * // => ['C', 'F', 'G', 'A', 'B']\n */\nexport function sortedNoteNames(notes: string[]): string[] {\n const valid = notes.map((n) => note(n)).filter((n) => !n.empty) as Note[];\n return valid.sort((a, b) => a.height - b.height).map((n) => n.name);\n}\n\n/**\n * Get sorted notes with duplicates removed. Pitch classes are listed\n * before notes.\n *\n * @function\n * @param {string[]} array\n * @return {string[]} unique sorted notes\n *\n * @example\n * Array.sortedUniqNoteNames(['a', 'b', 'c2', '1p', 'p2', 'c2', 'b', 'c', 'c3' ])\n * // => [ 'C', 'A', 'B', 'C2', 'C3' ]\n */\nexport function sortedUniqNoteNames(arr: string[]): string[] {\n return sortedNoteNames(arr).filter((n, i, a) => i === 0 || n !== a[i - 1]);\n}\n\n/**\n * Randomizes the order of the specified array in-place, using the Fisher–Yates shuffle.\n *\n * @function\n * @param {Array} array\n * @return {Array} the array shuffled\n *\n * @example\n * shuffle([\"C\", \"D\", \"E\", \"F\"]) // => [...]\n */\nexport function shuffle(arr: any[], rnd = Math.random): any[] {\n let i: number;\n let t: any;\n let m: number = arr.length;\n while (m) {\n i = Math.floor(rnd() * m--);\n t = arr[m];\n arr[m] = arr[i];\n arr[i] = t;\n }\n return arr;\n}\n\n/**\n * Get all permutations of an array\n *\n * @param {Array} array - the array\n * @return {Array<Array>} an array with all the permutations\n * @example\n * permutations([\"a\", \"b\", \"c\"])) // =>\n * [\n * [\"a\", \"b\", \"c\"],\n * [\"b\", \"a\", \"c\"],\n * [\"b\", \"c\", \"a\"],\n * [\"a\", \"c\", \"b\"],\n * [\"c\", \"a\", \"b\"],\n * [\"c\", \"b\", \"a\"]\n * ]\n */\nexport function permutations(arr: any[]): any[] {\n if (arr.length === 0) {\n return [[]];\n }\n return permutations(arr.slice(1)).reduce((acc, perm) => {\n return acc.concat(\n arr.map((e, pos) => {\n const newPerm = perm.slice();\n newPerm.splice(pos, 0, arr[0]);\n return newPerm;\n }),\n );\n }, []);\n}\n"],"mappings":";AACA,SAAS,YAAkB;AAG3B,SAAS,KAAK,GAAW,GAAW;AAClC,QAAM,IAAI,CAAC;AAEX,SAAO,KAAK,EAAE,CAAC,IAAI,IAAI,EAAE;AACzB,SAAO;AACT;AAEA,SAAS,MAAM,GAAW,GAAW;AACnC,QAAM,IAAI,CAAC;AAEX,SAAO,KAAK,EAAE,CAAC,IAAI,IAAI,EAAE;AACzB,SAAO;AACT;AAaO,SAAS,MAAM,MAAc,IAAsB;AACxD,SAAO,OAAO,KAAK,KAAK,MAAM,KAAK,OAAO,CAAC,IAAI,MAAM,MAAM,OAAO,KAAK,CAAC;AAC1E;AAaO,SAAS,OAAU,OAAe,KAAe;AACtD,QAAM,MAAM,IAAI;AAChB,QAAM,KAAM,QAAQ,MAAO,OAAO;AAClC,SAAO,IAAI,MAAM,GAAG,GAAG,EAAE,OAAO,IAAI,MAAM,GAAG,CAAC,CAAC;AACjD;AAWO,SAAS,QAAQ,KAAmB;AACzC,SAAO,IAAI,OAAO,CAAC,MAAM,MAAM,KAAK,CAAC;AACvC;AAeO,SAAS,gBAAgB,OAA2B;AACzD,QAAM,QAAQ,MAAM,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK;AAC9D,SAAO,MAAM,KAAK,CAAC,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;AACpE;AAcO,SAAS,oBAAoB,KAAyB;AAC3D,SAAO,gBAAgB,GAAG,EAAE,OAAO,CAAC,GAAG,GAAG,MAAM,MAAM,KAAK,MAAM,EAAE,IAAI,CAAC,CAAC;AAC3E;AAYO,SAAS,QAAQ,KAAY,MAAM,KAAK,QAAe;AAC5D,MAAI;AACJ,MAAI;AACJ,MAAI,IAAY,IAAI;AACpB,SAAO,GAAG;AACR,QAAI,KAAK,MAAM,IAAI,IAAI,GAAG;AAC1B,QAAI,IAAI,CAAC;AACT,QAAI,CAAC,IAAI,IAAI,CAAC;AACd,QAAI,CAAC,IAAI;AAAA,EACX;AACA,SAAO;AACT;AAkBO,SAAS,aAAa,KAAmB;AAC9C,MAAI,IAAI,WAAW,GAAG;AACpB,WAAO,CAAC,CAAC,CAAC;AAAA,EACZ;AACA,SAAO,aAAa,IAAI,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,SAAS;AACtD,WAAO,IAAI;AAAA,MACT,IAAI,IAAI,CAAC,GAAG,QAAQ;AAClB,cAAM,UAAU,KAAK,MAAM;AAC3B,gBAAQ,OAAO,KAAK,GAAG,IAAI,CAAC,CAAC;AAC7B,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,CAAC;AACP;","names":[]}