0.0.1 • Published 11 years ago

kurry-fns v0.0.1

Weekly downloads
1
License
-
Repository
github
Last release
11 years ago

Kurry-Fns 0.0.1

A small collection of functions for dealing with JavaScript functions

Documentation (work in progress)

This library explicitly depends on Kurry.js.

All functions are wrapped with Kurry.autopoly. The following is an example of what this means:

var _f = function (a, b, c) { return a+b+c }
var f = Kurry.autopoly(_f)

_f(2, 3, 4) //= 9
f(2, 3, 4) //= 9
f(2, 3)(4) //= 9
f(2)(3)(4) //= 9
f(2)(3, 4) //= 9

_f(2, 3)(4) //# Error, number is not a function

Fns.flip : (a b) b a

Given a function, flip the first two arguments round.

var div = function (a, b) { return a / b }
var divr = Fns.flip(div)
[div(3, 4), divr(3, 4), divr(4, 3)]
//= [0.75, 1.3(3), 0.75]

Fns.runl : (a b) a b

The function application function. Given a function and a value, apply the function to the value.

var f = function (a) { return a * 10 }

f(4) //= 40
Fns.runl(f, 4) //= 40
Fns.runl(f)(4) //= 40

Fns.runr : a (a b) b

Flipped version of runl. Given a value and a function, apply the function to the value.

var f = function (a) { return a * 2 }

f(8) //= 16
Fns.runr(8, f) //= 16
Fns.runr(8)(f) //= 16

var apply8 = Fns.runr(8)
apply8(f) //= 16

Fns.comp : (b c) (a b) a c

Function composition. comp(g, f)(x) = g(f(x)).

var g = function (a) { return a * 1000 }
var f = function (a) { return a + 20 }
var h = Fns.comp(g, f)
var i = Fns.comp(f, g)

h(6)
//= g(f(6))
//= g(6+20)
//= 26*1000
//= 26000

i(6)
//= f(g(6))
//= f(6*1000)
//= 6000+20
//= 6020

Fns.compr : (b c) (a b) a c

Flipped version of comp.

compr(f, g) = comp(g, f)

Fns.seq : a b, b ? a ?

Given a list of functions and a value. Apply each function from left to right to the output of the previous application, starting with the input value.

var g = function (a) { return a * 1000 }
var f = function (a) { return a + 20 }
var h = Fns.seq([f, g])
var i = Fns.seq([g, f])

h(6)
//= g(f(6))
//= g(6+20)
//= 26*1000
//= 26000

i(6)
//= f(g(6))
//= f(6*1000)
//= 6000+20
//= 6020

Fns.seqr : ? b, b a ? a

Same as seq, except the functions are applied right to left.

seq([a, b, c]) = seqr([c, b, a])

Fns.try : (a Error | b) b a b

Given a function, a default value, and an input, try to apply the function to the input. If it throws an exception, return the default value instead.

var div10By = function (b) {
  if (b === 0) { throw new Error('Division by zero!') }
  return 10 / b
}

Fns.try(div10By, 42, 2)
//= 10 / 2
//= 5

Fns.try(div10By, 42, 0)
//= 42, default value

Fns.template : Object (a ?) a Object ?

Given an object from keys to functions, and an input value: produce an object from keys to the results of applying the functions to the input.

var get = Kurry.autopoly(function (k, v) { return v[k] })
var templ = Fns.template({
  len: get('length'),
  name: get('name')
})

templ(function ADD(a, b) { return a + b })
//= { len: 2, name: 'ADD' }