/**
* 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
}