Skip to content

Instantly share code, notes, and snippets.

@alexandrebodin
Last active September 27, 2016 14:04
Show Gist options
  • Save alexandrebodin/033841afa9e6a0544757f33e11c45211 to your computer and use it in GitHub Desktop.
Save alexandrebodin/033841afa9e6a0544757f33e11c45211 to your computer and use it in GitHub Desktop.
applicative functors
import fs from 'fs';
import { add, prop, lift } from 'ramda';
import Task from 'data.task';
import Box from './Box';
import Maybe from './Maybe';
var marked = require('marked');
var TerminalRenderer = require('marked-terminal');
marked.setOptions({
// Define custom renderer
renderer: new TerminalRenderer()
});
// ------------
// Applicative functor
const t1 = Task.of(10)
const t2 = Task.of(5)
// What if I want to do this:
// add(t1, t2);
// Nan
// using map
// t1.map(add)
// Task.of(add(10))
// Now we want to apply add(10) to Task(5)
// you can do it like so
t1.map(fn => {
return t2.map(fn);
})
.fork(
err => console.log('error', err),
data => console.log(data)
);
// Here comes ap
Task.of(add).ap(t1).ap(t2)
.fork(
err => console.log('error', err),
data => console.log(data)
);
// It's called lifting a func
lift(add)(t1, t2)
.fork(
err => console.log('error', err),
data => console.log(data)
);
// more advance ex
//
const readPkg = readFile('package.json');
const readDoc = readPkg
.map(JSON.parse)
.map(prop('doc'))
.chain(readFile);
const displayInfos = (pkg, readme) => readme.concat('\n' + '```json\n' + pkg + '```');
const a = lift(displayInfos)(readPkg, readDoc)
.map(marked)
.fork(
err => console.log('error', err),
data => console.log(data)
);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment