# abstract-mapper

> Abstract Object Mapper

Latest version **0.1.5** (published 2015-06-11) · MIT license · 0 weekly downloads

## Install

```sh
npm install abstract-mapper
pnpm add abstract-mapper
yarn add abstract-mapper
bun add abstract-mapper
```

## Health

**Score 15/100 (F)** — status: abandoned.

Positive: no vulnerabilities.

Warnings: low downloads; no types; no esm support; pre 1.0.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 0.1.5 |
| Published | 2015-06-11 |
| First published | 2015-01-19 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | none |
| Module format | CommonJS |
| Dependencies | 0 |
| Known vulnerabilities | 0 |
| Install scripts | no |
| Author | nhz.io |
| Maintainers | nhz.io |
| Keywords | nhz.io, abstract, object, mapper, abstract-mapper, coffee-script, coffeescript, coffee |

## Links

- npm: https://www.npmjs.com/package/abstract-mapper
- Repository: https://github.com/nhz-io/abstract-mapper
- Issues: https://github.com/nhz-io/abstract-mapper/issues
- npm.io page: https://npm.io/package/abstract-mapper

## Recent versions

- 0.1.5 (latest) — 2015-06-11
- 0.1.4 — 2015-06-11
- 0.1.3 — 2015-03-06
- 0.1.2 — 2015-03-05
- 0.1.1 — 2015-03-03
- 0.1.0 — 2015-03-03
- 0.0.10 — 2015-01-20
- 0.0.9 — 2015-01-20
- 0.0.8 — 2015-01-20
- 0.0.7 — 2015-01-19
- 0.0.6 — 2015-01-19
- 0.0.5 — 2015-01-19
- 0.0.4 — 2015-01-19
- 0.0.3 — 2015-01-19
- 0.0.2 — 2015-01-19
- … 1 more at https://npm.io/package/abstract-mapper/versions

## README

# abstract-mapper

## Abstract Object Mapper [![Build Status][travis-image]][travis-url]
[![NPM][npm-image]][npm-url]

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][coffeescript-url] in mind.

## Install
```
npm install --save abstract-mapper
```

## Browser
* [abstract-mapper.js](abstract-mapper.js)
* [abstract-mapper.min.js](abstract-mapper.min.js)

## Usage

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

## Examples

### Object -> Object, Swap keys and values
```coffeescript
  mapper = new AbstractMapper [
    -> {}
    ($) -> this[value] = key for key, value of $
    -> this
  ]
```

### Explode Object recursively
```coffeescript
  mapper = new AbstractMapper [
    -> if this instanceof Array then this else []

    ($) ->
      nested = []
      for key, value of $
        if typeof value is 'object'
          nested.push value
        else
          result = {}
          result[key] = value
          @push result

      for data in nested
        mapper.call this, data

    -> this
  ]
```

### JSON -> DOM
```coffeescript
  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
```coffeescript
  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](http://jsperf.com/abstract-mapper/6)

LICENSE
-------
#### [MIT](LICENSE)

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](.npmignore) to exclude only browser dist files

#### 0.1.0
* API is totally different from v0.0.10 (Abusing [CoffeeScript][coffeescript-url] sugar)
* Added build system ([GULP][gulp-url])
* Added travis-ci


[coffeescript-url]: https://github.com/jashkenas/coffeescript
[gulp-url]: https://github.com/gulpjs/gulp

[travis-image]: https://travis-ci.org/nhz-io/abstract-mapper.svg
[travis-url]: https://travis-ci.org/nhz-io/abstract-mapper

[npm-image]: https://nodei.co/npm/abstract-mapper.png
[npm-url]: https://nodei.co/npm/abstract-mapper

---
_Source: https://npm.io/package/abstract-mapper · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
