> For the complete documentation index, see [llms.txt](https://packhouse-doc.metalsheep.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://packhouse-doc.metalsheep.com/the-instance/merger.md).

# Merger

## Property

[Molds](/the-instance/group/mold.md)： 參數型別，可視為Interface或Type的功能。

Groups：[Group](/the-instance/group.md)群組，應用方法請至[How To Use](/the-instance/merger.md#how-to-use)查看。

```javascript
let merger = {
    molds: 'molds',
    groups: 'groups'
}
```

## TypeScript

如果你使用TypeScript，可以使用我們提供的Declaration File。

```javascript
import { Merger } from 'packhouse/types'

let merger: Merger = {}
```

## How To Use

我們可以藉由`merger`方法加入Merger，並傳遞Options，但我們不推薦這麼做，請參閱正規化方法[Main](/the-instance/main.md)。

{% hint style="info" %}
Merger會以[`namespace@`](/the-instance/merger.md#sign)的Sign建立Mold與Group。
{% endhint %}

### Molds

Merger的Mold會被註冊進Core Mold中，各地都能引用。

```javascript
const group = {
    tools: {
        sum: {
            request: ['myMerger@int', 'myMerger@int'],
            handler(self, v1, v2) {
                self.success(v1 + v2)
            }
        }
    }
}

const merger = {
    molds: {
        int(value) {
            return Math.floor(value)
        }
    }
}

packhouse.merger('myMerger', merger)
packhouse.addGroup('math', group)

packhouse.tool('math/sum').action(1.1, 2.5, (err, result) => {
    console.log(result) // 3
})
```

### Groups

```javascript
const group = {
    tools: {
        sum: {
            handler(self, v1, v2) {
                self.success(v1 + v2)
            }
        }
    }
}

const merger = {
    groups: {
        math(options) {
            console.log(options.PI) // 3.14159...
            return {
                data: group
            }
        }
    }
}

packhouse.merger('myMerger', merger, {
    PI: Math.PI
})

packhouse.tool('myMerger@math/sum').action(...)
```

## Module

Merger的另一個特點是內部引用，當Merger互相引用對方時不需要添加`sign`。

```javascript
let group1 = {
    tools: {
        sum: {
            handler(self, v1, v2) {
                self.success(v1 + v2)
            }
        }
    }
}

let group2 = {
    mergers: {
        mySumGroup: 'sumGroup'
    },
    tools: {
        double: {
            install({ include }) {
                include('sum').tool('mySumGroup/sum')
            },
            handler(self, v1) {
                self.tool('sum').action(v1, v1, (e, r) => {
                    self.success(r)
                })
            }
        }
    }
}

let merger = {
    groups: {
        sumGroup() {
            return {
                data: group1
            }
        },
        doubleGroup() {
            return {
                data: group2
            }
        }
    }
}

packhouse.merger('myMerger', merger)

packhouse.tool('myMerger@doubleGroup/double').action(10, (e, r) => {
    console.log(r) // 20
})
```
