abstract-mapper

0.1.5 • Public • Published

abstract-mapper

Abstract Object Mapper Build Status

NPM

Utility class to generate a mapper function from the array of handler functions. The array of handler functions is passed as a first argument ot the AbstractMapper constructor. The first handler function in the array being a context initializer.

The result of context initializer is passed as thisarg to every subsequent handler function. Each handler function receives the same arguments. The result of the last handler function is the value that the mapper function will return.

The array of handler functions that is passed to AbstractMapper constructor, can also contain nested arrays. In this case, a nested mapper will be constructed from this array. This nested mapper will be called with the same thisarg, as the rest of the handler functions.

This module was created with CoffeeScript in mind.

Install

npm install --save abstract-mapper

Browser

Usage

mapper = new AbstractMapper [
  (args...) -> ...    # Init 
  (args...) -> ...
  [                   # Nested mapper 
    (args...) -> ...
    (args...) -> ...
  ]
  (args...) -> ...    # Result 
]

Examples

Object -> Object, Swap keys and values

  mapper = new AbstractMapper [
    -> {}
    ($) -> this[value= key for keyvalue of $
    -> this
  ]

Explode Object recursively

  mapper = new AbstractMapper [
    -> if this instanceof Array then this else []
 
    ($) ->
      nested = []
      for keyvalue of $
        if typeof value is 'object'
          nested.push value
        else
          result = {}
          result[key= value
          @push result
 
      for data in nested
        mapper.call thisdata
 
    -> this
  ]

JSON -> DOM

  mapper = new AbstractMapper [
    ($) -> if typeof $ is 'string' then textMapper $ else nodeMapper $
  ]
 
  textMapper = new AbstractMapper [ ($) -> document.createTextNode $ ]
 
  nodeMapper = new AbstractMapper [
    ($) -> document.createElement $.element or 'div'
    ($) -> @className = $.class if $.class
    ($) -> @setAttribute 'style'$.style if $.style
    ($) -> @appendChild mapper child for child in $.children or []
    -> this
  ]

DOM -> JSON

  mapper = new AbstractMapper [
    ($) -> if $.nodeType is 3 then textMapper $ else nodeMapper $
  ]
 
  textMapper = new AbstractMapper [ ($) -> $.data ]
 
  nodeMapper = new AbstractMapper [
    -> {}
    ($) -> @element = $.nodeName.toLowerCase()
    ($) -> @class = $.className if $.className
    ($) -> @style = style if style = $.getAttribute? 'style'
    ($) -> @children = [if $.childNodes.length
    ($) -> @children.push mapper child for child in $.childNodes
    -> this
  ]

Build

git clone https://github.com/nhz-io/abstract-mapper.git
cd abstract-mapper
npm install
gulp

Benchmark

JSPERF

LICENSE

MIT

VERSION

0.1.5

  • More README, More meaningful variable names

0.1.4

  • Removed junk rudiment (AbstractMapper.Context)

0.1.3

  • Fixed RangeError: Maximum call stack size exceeded on nested mappers

0.1.2

  • Added empty Context class under AbstractMapper.Context

0.1.1

  • Fixed .npmignore to exclude only browser dist files

0.1.0

  • API is totally different from v0.0.10 (Abusing CoffeeScript sugar)
  • Added build system (GULP)
  • Added travis-ci

Package Sidebar

Install

npm i abstract-mapper

Weekly Downloads

2

Version

0.1.5

License

MIT

Last publish

Collaborators

  • ishi.ruy