Skip to content

Instantly share code, notes, and snippets.

@kwijibo
Last active February 6, 2016 22:43
Show Gist options
  • Save kwijibo/84c3b39d70eb79a6b610 to your computer and use it in GitHub Desktop.
Save kwijibo/84c3b39d70eb79a6b610 to your computer and use it in GitHub Desktop.
Future that can have a value applied to its map function
// submit :: event -> IO[ HttpGet[ Either [ HttpPost []]]]
const submit = (event) => {
return getFormFields()
.map(incrementVersionNumber)
.map(saveRecord)
}
// getFormFields :: () -> IO
const getFormFields = () => IO(()=>{
return lift()
})
const split = SingleChar(
c => AnyString(
s => s.split(c)
)
)
const f = Future((reject,resolve)=> setTimeout(m=>resolve("hello"),1000))
.map(x=>x+' world')
.map(s=>s.toUpperCase())
f.fork(console.error, console.log)
const Future = function(){}
Future.of = (forkr, mapr=x=>x) => {
return Object.assign(new Future(), {
map: (f)=> Future(forkr, x=>f(mapr(x))),
fork: (err,success)=> {
forkr(err,x=>success(mapr(x)))
},
apply: x => mapr(x)
})
}
Future.subType = function(makeForkr,argNames){
function ctor(...args){
const objProps = argNames.reduce((obj,k,i)=>{obj[k]= args[i]; return obj},{})
return Object.assign(Object.create(ctor.prototype), objProps, Future.of(makeForkr(...args)))
}
ctor.prototype = Future.prototype
return ctor
}
const HttpGet = function(){}
HttpGet.of = (url,headers={accept:'application/json'}) => {
return Object.assign(
new HttpGet()
, {url,headers}
, Future((rej,res)=>{ request({url,headers},(err,succ)=>err? rej(err) : res(succ) )})
)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment