• Stars
    star
    175
  • Rank 218,059 (Top 5 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created over 8 years ago
  • Updated over 6 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Free monad Collection

Collection of Free monads

Install

npm install freeky

Synopsis

Video series on Free Monads here: https://www.youtube.com/watch?v=WH5BrkzGgQY&list=PLK_hdtAJ4KqUWp5LJdLOgkD_8qKW0iAHi&index=1

Walking through our example.js

Run with node --harmony_destructuring example.js

// either Example
const gtZero = x =>
  (x > 0) ? Right(x) : Left("it was less than zero")

// cont example (cont just wraps task. prob a misnomer)
const asyncGet = n =>
  Cont((rej, res) => setTimeout(() => res(n), 100))

// do syntax works for any 1 monad. Since it's all in Free, we can use multiple
const app = Monad.do(function *() {
  const ioNumber = yield IO(() => 1)
  const maybeNumber = yield Just(2)
  const contNumber = yield asyncGet(3)
  const eitherNumber = yield gtZero(4)
  return Monad.of(ioNumber + maybeNumber + eitherNumber + contNumber)
})

// some nt's to Task
const maybeToTask = m => m.fold(Task.of, Task.rejected)
const contToTask = c => c.t
const eitherToTask = m => m.fold(Task.rejected, Task.of)
const ioToTask = i => new Task((rej, res) => res(i.f()))

// this tells our Free.foldMap how to dispatch. We need all of them to turn into a target monad (in this case Task)
const runApp = dispatch([ [IOType, ioToTask],
                          [ContType, contToTask],
                          [Either, eitherToTask],
                          [Maybe, maybeToTask]
                        ])

app.foldMap(runApp, Task.of).fork(console.error, console.log)

Custom Types

You can define your own types in Free and use them as monads. This is useful if you want to define a composable dsl or multiple interpreters for an action:

const Http = daggy.taggedSum({ Get: ['url'], Post: ['url', 'data'] })
const {Get, Post} = Http

const get = url => liftF(Get(url))
const post = (url, data) => liftF(Post(url, data))

var myFn = get('/home').chain(html => post('save', {markup: html})

const httpToTask = m =>
  m.cata({
    Get: url => new Task((rej, res) => $.getJSON(url).then(res).error(rej),
    Post: (url, data) => new Task((rej, res) => $.post(url, data).then(res).error(rej))
  })

myFn.foldMap(httpToTask, Task.of)

or fake it for testing:

const httpToId = m =>
  m.cata({
    Get: url => Id(`getting ${url}`),
    Post: (url, data) => Id(`posting ${url} with ${data}`)
  })

myFn.foldMap(httpToId, Id.of)

use it with other monads

const app = Monad.do(function *() {
  const page = yield get('/myUrl')
  const maybeHeader = yield Just($('#header', page))
  return maybeHeader.chain(h => IO(() => console.log(h)))
})

const runApp = dispatch([ [IOType, ioToTask],
                          [Http, httpToTask],
                          [Maybe, maybeToTask]
                        ])

runApp.foldMap(httpToTask, Task.of)

More Repositories

1

immutable-ext

fantasyland extensions for immutablejs
JavaScript
490
star
2

pointfree-fantasy

Point free wrappers for fantasy land
JavaScript
450
star
3

Practically-Functional

practically functional programming workshop
JavaScript
222
star
4

lenses

Composable kmett style lenses
JavaScript
213
star
5

classroom-coding

Video series code
JavaScript
130
star
6

patterns_talk

code from fluent talk
JavaScript
97
star
7

Functional-Javascripts

algebraic data types, pattern matching, applicatives, monads, prelude, oliver steele's lib modified
JavaScript
86
star
8

RecursionTalk

Talk for Forward Conference Feb 2015
JavaScript
83
star
9

Oh-Composable-World

React Rally 2016
JavaScript
63
star
10

excursion

recursion-schemes in JS
JavaScript
57
star
11

spotify-fp-example

Egghead.io lesson
JavaScript
41
star
12

hardcorejs

Demos for the class
JavaScript
20
star
13

monio-demo-app

JavaScript
5
star
14

xamin

Examines rails apps and generates xmi for uml
Ruby
4
star
15

Code-Review

Creates pdf of modified files for code review.
3
star
16

Dizzywyg

A mini-wysiwyg that will apply css rules and semantic markup
JavaScript
3
star
17

CrudLinks

Dynamically creates links for crud actions.
Ruby
3
star
18

scottydemo

Port of scotty over express
JavaScript
2
star
19

Set-Attribute-Order

Declare an order for setters
Ruby
2
star
20

Nav-y

Yaml based navigation
Ruby
2
star
21

beautiful-folds

https://www.youtube.com/watch?v=6a5Ti0r8Q2s
1
star
22

Interfaces

Declare an interface and get yelled at for not implementing it.
Ruby
1
star
23

Public-Accessor

An attempt at public/private methods for rails attributes
Ruby
1
star
24

cssthingy

JavaScript
1
star
25

cypher

Scala
1
star
26

FRP-talk

1
star