functional-light
Advanced tools
Comparing version 0.2.0 to 0.3.0
/** | ||
* Agreaga el elemento value al comienzo de la lista. | ||
* Agrega el elemento value al comienzo de la lista. | ||
* @param {*} value | ||
* @param {Array} list | ||
* @returns {Array} | ||
* @example cons(1, [2, 3]); // => [1, 2, 3] | ||
*/ | ||
@@ -15,2 +17,4 @@ function cons(value, list) { | ||
* @param {Array} list | ||
* @example first([1, 2, 3]) // => 1 | ||
* @returns {*} | ||
*/ | ||
@@ -24,2 +28,4 @@ function first(list) { | ||
* @param {Array} list | ||
* @returns {Array} | ||
* @example rest([1, 2, 3]); // => [2, 3] | ||
*/ | ||
@@ -33,2 +39,6 @@ function rest(list) { | ||
* @param {Array} list | ||
* @returns {boolean} | ||
* @example isEmpty([1, 2, 3]); // => false | ||
* @example isEmpty([]); // => true | ||
*/ | ||
@@ -43,4 +53,9 @@ function isEmpty(list) { | ||
/** | ||
* El objeto de entrada es una lista? | ||
* @param {Array} list | ||
* Retorna verdadero si el objeto de entrada es una lista | ||
* @param {Array} list | ||
* @returns {boolean} | ||
* @example isList([]); // => true | ||
* @example isList([1, 2]); // => true | ||
* @example isList(1); // => false | ||
* @example isList("Hola"); // => false | ||
*/ | ||
@@ -54,2 +69,5 @@ function isList(list) { | ||
* @param {Array} list | ||
* @returns {Number} | ||
* @example length([]); // => 0 | ||
* @example length([2, 4]); // => 2 | ||
*/ | ||
@@ -65,2 +83,4 @@ function length(list) { | ||
* @param {Array | Object} list2 | ||
* @returns {Array} | ||
* @example append([1, 2], [3, 4]); // => [1, 2, 3, 4] | ||
*/ | ||
@@ -78,2 +98,34 @@ function append(list1, list2) { | ||
module.exports = { cons, first, rest, isEmpty, isList, length, append }; | ||
/** | ||
* Filtra la lista l usando la función f. | ||
* @param {Array} l | ||
* @param {function} f función booleana | ||
* @returns {Array} | ||
* @example filter([1, 2, 3, 4, 5], x => x % 2 === 1); // => [1, 3, 5] | ||
*/ | ||
function filter(l, f) { | ||
if (isEmpty(l)) { | ||
return []; | ||
} else if (f(first(l))) { | ||
return cons(first(l), filter(rest(l), f)); | ||
} else { | ||
return filter(rest(l), f); | ||
} | ||
} | ||
/** | ||
* Aplica la función f a cada elemento del arreglo a | ||
* @param {Array} a | ||
* @param {function} f | ||
* @returns {Array} | ||
* @example console.log(map([1,2,3], x => x*x)); // => [1, 4, 9] | ||
*/ | ||
let map = function (a, f) { | ||
if (isEmpty(a)) { | ||
return []; | ||
} else { | ||
return cons(f(first(a)), map(rest(a), f)); | ||
} | ||
}; | ||
module.exports = { cons, first, rest, isEmpty, isList, length, append, filter, map }; |
{ | ||
"name": "functional-light", | ||
"version": "0.2.0", | ||
"version": "0.3.0", | ||
"description": "Librería para el curso de programación funcional con JavaScript", | ||
@@ -36,3 +36,4 @@ "keywords": [ | ||
"compile": "babel src --out-dir lib --quiet --ignore __tests__", | ||
"prepublish": "npm run compile" | ||
"prepublish": "npm run compile", | ||
"jsdoc": "jsdoc2md src/index.js > docs/functional-light.md" | ||
}, | ||
@@ -42,2 +43,3 @@ "devDependencies": { | ||
"babel-preset-env": "^1.7.0", | ||
"chai": "4.2.0", | ||
"eslint": "^5.15.3", | ||
@@ -48,6 +50,6 @@ "eslint-config-cheminfo": "^1.20.1", | ||
"jest": "^24.5.0", | ||
"rimraf": "^2.6.3", | ||
"chai": "4.2.0" | ||
"jsdoc-to-markdown": "^5.0.0", | ||
"rimraf": "^2.6.3" | ||
}, | ||
"dependencies": {} | ||
} |
102
README.md
# Programación funcional con JavaScript | ||
## Instalar paquete | ||
## Instalación paquete | ||
@@ -9,2 +9,6 @@ ```bash | ||
## Documentación del API | ||
[Ver todas las funciones](docs/functional-light.md) | ||
## Ejemplo | ||
@@ -15,3 +19,2 @@ | ||
console.log(cons('1',[])); // ['1'] | ||
@@ -32,1 +35,96 @@ console.log(cons('2', cons('1',[]))); // ['2', '1'] | ||
``` | ||
# Crear un nuevo proyecto usando esta librería | ||
Crear un nuevo directorio para el proyecto. En este ejemplo usaremos **fl-extended**. Luego debemos inicializar el proyecto usando npm init y llenar los campos de manera adecuada según le pregunte la herramienta. Usar *jest* para las pruebas | ||
``` bash | ||
mkdir fl-extended | ||
cd fl-extended | ||
npm init | ||
``` | ||
Luego instalamos la librería functional-light y jest para la pruebas. Con los comando siguientes no solo se instalan las librerías, sino que además se incluyen las librerías en el archivo package.json | ||
``` bash | ||
npm i functional-light | ||
npm i jest --save-dev | ||
npm i browserify --save-dev | ||
``` | ||
Incluya los siguientes scripts en el archivo package.json | ||
``` js | ||
"scripts": { | ||
"test": "jest", | ||
"build": "browserify -r ./src/index.js:fl-extended -o ./dist/fl-extended.js" | ||
} | ||
``` | ||
El archivo package.json debería verse como esto: | ||
``` js | ||
{ | ||
"name": "fl-extended", | ||
"version": "1.0.0", | ||
"description": "Example project", | ||
"main": "src/index.js", | ||
"scripts": { | ||
"test": "jest", | ||
"build": "browserify -r ./src/index.js:fl-extended -o ./dist/fl-extended.js" | ||
}, | ||
"author": "Andres M. Castillo", | ||
"license": "MIT", | ||
"dependencies": { | ||
"functional-light": "^0.2.0" | ||
}, | ||
"devDependencies": { | ||
"browserify": "^16.5.0", | ||
"jest": "^24.8.0", | ||
} | ||
} | ||
``` | ||
Creamos la carpeta que contendrá el código fuente. Estos pasos se pueden hacer desde el IDE de desarrollo o desde el navegador de archivos. Aqui continuo en bash | ||
``` bash | ||
mkdir src | ||
``` | ||
Dentro de esta carpeta pondremos todo nuestro código fuente. Para este ejemplo supongamos que queremos extender nuestra librería functional-light para agregar la función map, que recibe un arreglo, un función f y retorna una nueva lista con los elementos de la lista original mapeados usando la función f. El siguiente código debe ir en *src/index.js* | ||
``` js | ||
const { cons, first, rest, isEmpty, isList, append, length } = require('functional-light'); | ||
/** | ||
* Apply a function f to each element of the array a | ||
* @param {Array} a | ||
* @param {function} f | ||
* @example console.log(map([1,2,3], x => x*x)); // => [1, 4, 9] | ||
*/ | ||
let map = function(a, f) { | ||
if (isEmpty(a)) { | ||
return []; | ||
} else { | ||
return cons(f(first(a)), map(rest(a), f)); | ||
} | ||
} | ||
// We export all the previous functions + our current implementation of map | ||
module.exports = { cons, first, rest, isEmpty, isList, append, length, map } | ||
``` | ||
## Compilar el paquete para el navegador | ||
Ahora para obtener una librería que pueda ser usada en nuestro framework-canvas, debemos compilar el proyecto para obtener un archivo javascript para el navegador. Para esto, debemos compilar usando browserify | ||
``` bash | ||
npm run build | ||
``` | ||
Ahora tendremos nuestro archivo compilado en la carpeta **dist**. El archivo se llama **fl-extended.js** según especificamos en el package.json | ||
Ahora pueden copiar este archivo dentro de la carpeta web-lib de su proyecto HTML y deben importarlo usando una etiqueta de script. Algo como esto: | ||
``` html | ||
<script src="web-lib/fl-extended.js"></script> | ||
<script> | ||
// Importamos las librerias | ||
let { append, cons, first, isEmpty, isList, length, rest, map } = require('fl-extended'); | ||
``` |
8413
113
128
10