Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
@skava/modules-modules / deps / transformWhere.ts
Size: Mime:
import { path, lens, assocPath, set } from 'ramda'
import { makeShape, recurse, curry2 } from 'chain'

/**
 * @TODO property, value
 * @TODO can use http://ramdajs.com/docs/#applySpec - for some of the lifting
 * @see http://funkyjavascript.com/lenses/
 * @curried 2
 *
 * @param shape to match & reshape
 * @param obj object to transform
 * @return transformed object
 */
const transformWhereObj = curry2((shape, obj) => {
  let transformed = obj
  const shapeEvolver = makeShape(shape)

  recurse(obj).forEach((x, key, traverser) => {
    if (traverser.isRoot) return

    const evolution = shapeEvolver(x, key)

    // when we have an evolution, use it
    if (evolution !== false) {
      const setForPath = lens(path(traverser.path), assocPath(traverser.path))
      transformed = set(setForPath, evolution, transformed)

      // do not go any deeper
      // traverser.skip()
    }
  })

  return transformed
})

// @PLAY
// @NOTE these are similar to the lens prop above
// transformed = R.assocPath(traverser.path, evolution, transformed)
// const setForPath = R.assocPath(this.path, R.__, transformed)
// traverser.update(evolution)
// const lensForPath = R.lensPath()
// transformed = R.over(setForPath, R.negate, { x: 1, y: 2 })

export { transformWhereObj, transformWhereObj as transformWhere }
export default transformWhereObj