influentialpublishers/kuss

View on GitHub
lib/util/index.js

Summary

Maintainability
A
3 hrs
Test Coverage
/* eslint no-magic-numbers: 0 */

const R = require('ramda')


const ascend = R.curry((fn, a, b) => {
  const aa = fn(a)
  const bb = fn(b)
  return aa < bb ? -1 : aa > bb ? 1 : 0
})


const descend = R.curry((fn, a, b) => {
  const aa = fn(a)
  const bb = fn(b)
  return aa > bb ? -1 : aa < bb ? 1 : 0
})


const sortWhere = R.curry((fns, list) =>
  Array.prototype.slice.call(list, 0).sort(function(a, b) {
    let result = 0
    let i      = 0
    while (0 === result && i < fns.length) {
      result = fns[i](a, b)
      i += 1
    }
    return result
  })
)


// renameProp :: String -> String -> { String : * } -> { String : * }
const renameProp = R.curry((from, to, obj) => R.when(
  R.has(from)
, R.compose(R.omit(from), R.assoc(to, R.prop(from, obj)))
)(obj))


// replaceElement :: * -> * -> [ * ] -> [ * ]
const replaceElement = R.curry((from, to, list) => R.when(
  R.contains(from)
, R.over(R.lensIndex(R.indexOf(from, list)), R.always(to))
)(list))


const notNil = R.compose(R.not, R.isNil)


const isEmptyOrNil = R.either(R.isEmpty, R.isNil)


module.exports = {
  ascend
, descend
, sortWhere
, renameProp
, replaceElement
, notNil
, isEmptyOrNil
}