Packhouse
Search…
Line
Packhouse Line

Curry Function

Curry Function是個「將一個接受 n 個參數的 function,轉變成 n 個只接受一個參數的 function」的過程,JavaScript的Array就是經典的Curry Function表現,範例如下:
let boys = ['boy', 'girl'].concat(['boy', 'girl']).filter(s => s === 'boy')
但Packhouse的Curry實現完全不是這樣 😰。

Property

Install、Request都是針對inputTool Property,對於執行Line的驗證。
而Response是針對output的驗證。
Install的行為在每次呼叫時都會執行,對Line來說每一次都是新的開始。
let line = {
input: 'function',
output: 'function',
layout: 'tools',
install: 'function',
request: 'array',
response: 'string'
}

How To Use

為了擁有對付高度複雜性的功能,Line的定義並不輕鬆,Store是Line的主要共享狀態物件。
每次執行時Store都會是一個全新的對象,Tool則會永久保持最後設定的狀態。
下列範例會看見只有在output時才真正回傳結果,而其他的動作代表next的行為。
const group = {
tools: {
sum: {
handler: (self, v1, v2) => self.success(v1, v2)
}
},
lines: {
math: {
request: ['number'],
response: 'number',
install({ include }) {
include('sum').tool('sum')
},
input(self, value) {
self.store.value = value
self.success()
},
output(self) {
self.success(self.store.value)
},
layout: {
add: {
request: ['number'],
handler(self, value) {
self.tool('sum')
.action((error, result) => {
self.store.value = result
self.success()
})
}
},
double: {
handler(self) {
self.store.value *= 2
self.success()
}
}
}
}
}
}
packhouse.addGroup('math', () => {
return {
data: group
}
})

Invoke

Line不存在noGood、always等Pre-Invoke行為,也必須丟入一個初始值觸發input,相對的並不需要在最後中Invoke行為中給予任何參數,詳情請見Invoke
packhouse
.line('math/math')(10)
.add(5)
.add(10)
.double()
.action((error, result) => {
console.log(result) // 50
})
Last modified 2yr ago
Copy link
On this page
Curry Function
Property
How To Use
Invoke