Source: utils/array.js

/**
 * This file is part of SesaJsTools.
 *   Copyright 2014-2015, Association Sésamath
 *
 * SesaJsTools is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License version 3
 * as published by the Free Software Foundation.
 *
 * SesaJsTools is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with SesaJsTools (LICENCE.txt).
 * @see http://www.gnu.org/licenses/agpl.txt
 *
 *
 * Ce fichier fait partie de l'application Sésathèque, créée par l'association Sésamath.
 *
 * Sésathèque est un logiciel libre ; vous pouvez le redistribuer ou le modifier suivant
 * les termes de la GNU Affero General Public License version 3 telle que publiée par la
 * Free Software Foundation.
 * Sésathèque est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE GARANTIE,
 * sans même la garantie tacite de QUALITÉ MARCHANDE ou d'ADÉQUATION à UN BUT PARTICULIER.
 * Consultez la GNU Affero General Public License pour plus de détails.
 * Vous devez avoir reçu une copie de la GNU General Public License en même temps que Sésathèque
 * (cf LICENCE.txt et http://vvlibri.org/fr/Analyse/gnu-affero-general-public-license-v3-analyse
 * pour une explication en français)
 */

'use strict'

/**
 * Renvoie une copie de tab où toutes les chaînes représentant des entiers
 * sont des numbers (récursivement), les autres laissées intactes
 * @param {Array}   tab               Le tableau à analyser
 * @param {Boolean} [deep=true]       Passer false pour ne pas faire de récursion
 * @param {Boolean} [mustThrow=true]  Passer false pour renvoyer un tableau vide si tab n'est pas un array
 *                                    (sinon throw une Error si c'est le cas)
 * @returns {Array}
 */
function integerify (tab, deep = true, mustThrow = true) {
  if (!Array.isArray(tab)) {
    if (mustThrow) throw new Error('integerify appelé avec autre chose qu’un array')
    else return []
  }
  return tab.map(function (elt) {
    if (Array.isArray(elt)) {
      if (deep) return integerify(elt)
    } else if (typeof elt === 'string' || typeof elt === 'number') {
      var i = parseInt(elt, 10)
      if (elt == i) return i // eslint-disable-line eqeqeq
    }
    return elt
  })
}

/**
 * Renvoie un tableau filtré ne contenant que des valeurs entières (récursivement),
 * les falsy qui ne sont pas des strings sont éliminés
 * @param {Array}   tab               Le tableau à analyser
 * @param {Boolean} [deep=true]       Passer false pour ne pas faire de récursion
 * @param {Boolean} [mustThrow=true]  Passer false pour renvoyer un tableau vide si tab n'est pas un array
 *                                    (sinon throw une Error si c'est le cas)
 * @returns {Array}
 */
function integerifyStrict (tab, deep = true, mustThrow = true) {
  if (!Array.isArray(tab)) {
    if (mustThrow) throw new Error('integerifyStrict appelé avec autre chose qu’un array')
    else return []
  }
  return tab.map(function (elt) {
    if (deep && Array.isArray(elt)) {
      return integerifyStrict(elt, deep)
    }
    if (typeof elt === 'string' || typeof elt === 'number') {
      var i = parseInt(elt, 10)
      if (elt == i) return i // eslint-disable-line eqeqeq
    }
    return null
  }).filter(function (elt) {
    return elt !== null
  })
}

/**
 * Retourne une copie du tableau où tous les éléments sont passés à String(), récursivement
 * @param {Array}   tab               Le tableau à analyser
 * @param {Boolean} [deep=true]       Passer false pour ne pas faire de récursion
 * @param {Boolean} [mustThrow=true]  Passer false pour renvoyer un tableau vide si tab n'est pas un array
 *                                    (sinon throw une Error si c'est le cas)
 * @returns {Array}
 */
function stringify (tab, deep = true, mustThrow = true) {
  if (!Array.isArray(tab)) {
    if (mustThrow) throw new Error('stringify appelé avec autre chose qu’un array')
    else return []
  }
  return tab.map(function (elt) {
    if (deep) return Array.isArray(elt) ? stringify(elt, deep) : String(elt)
    else return String(elt)
  })
}

/**
 * Collection de fonctions génériques pour manipuler des tableaux
 * @service sesajstools/utils/array
 */
module.exports = {
  integerify: integerify,
  integerifyStrict: integerifyStrict,
  stringify: stringify
}