functional-light
Version:
Librería para el curso de programación funcional con JavaScript
155 lines (121 loc) • 4.91 kB
Markdown
# Programación funcional con JavaScript
## Instalación paquete
```bash
npm i functional-light
```
## Documentación del API
[Ver todas las funciones](docs/functional-light.md)
## Ejemplo
```js
const { cons, first, rest, isEmpty, isList } = require('functional-light');
console.log(cons('1',[])); // ['1']
console.log(cons('2', cons('1',[]))); // ['2', '1']
console.log(isList(cons('1',[]))); // TRUE
console.log(isList({length: false })); // false
console.log(isEmpty(cons('1',[]))); // false
console.log(isEmpty([])); // true
console.log(isEmpty(9)); // false
console.log(rest(cons(1, cons(2, [])))); // [2]
console.log(rest([])); // []
console.log(cons(1, [2, 3])); // []
console.log(length(cons(1, [2, 3]))); // 3
const foo = cons(484, []);
console.log(cons('XX', foo))
console.log(foo); // Debe imprimir [484]
```
# 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');
```
## Crear una suite de pruebas usando JEST
Para crear las pruebas de las funciones vamos a utilizar el framework para pruebas JEST.
La pruebas se deben poner una carpeta con nombre __tests__. A continuación se muesta un ejemplo de suite de pruebas. deepEqual sirve para hacer pruebas sobre arreglos
``` js
const { assert } = require('chai');
const { cons, first, rest, isEmpty, isList, append, length, filter, map } = require('../');
describe('functional-light', () => {
it('test cons', () => {
assert.typeOf(cons('1', []), 'array'); // ['1']
assert.deepEqual(cons('1', []), ['1']); // ['1']
assert.deepEqual(cons('2', cons('1', [])), ['2', '1']); // ['2', '1']
assert.deepEqual(cons(1, [2, 3]), [1, 2, 3]);
const foo = cons(484, []);
cons('XX', foo)
assert.deepEqual(foo, cons(484, []));
});
}
```