首页 > 代码库 > [JS Compose] 6. Semigroup examples
[JS Compose] 6. Semigroup examples
Let‘s we want to combine two account accidently have the same name.
const acct1 = { name: ‘Nico‘, isPaid: true, points: 10, friends: [‘Franklin‘] }const acct2 = { name: ‘Nico‘, isPaid: false, points: 2, friends: [‘Gatsby‘] }
So, here we can use Semi-group to combine them, because the semi-group have the knowledge how to combine for each type of object.
So we change two accounts as:
const acct1 = { name: First(‘Nico‘), isPaid: All(true), points: Sum(10), friends: [‘Franklin‘] }const acct2 = { name: First(‘Nico‘), isPaid: All(false), points: Sum(2), friends: [‘Gatsby‘] }
But here we still have one problem which Object doesn‘t have ‘concat‘ method, so we need to use Immutable library to help:
Includes libarary:
const {Map} = Immutable;
const acct1 = Map({ name: First(‘Nico‘), isPaid: All(true), points: Sum(10), friends: [‘Franklin‘] })const acct2 = Map({ name: First(‘Nico‘), isPaid: All(false), points: Sum(2), friends: [‘Gatsby‘] })
---------
const {Map} = Immutable;const Sum = x =>({ x, concat: ({x: y}) => Sum(x + y), inspect: () => `Sum(${x})`})const All = x =>({ x, concat: ({x: y}) => All(x && y), inspect: () => `All(${x})`})const First = x =>({ x, concat: _ => First(x), inspect: () => `First(${x})`})const acct1 = Map({ name: First(‘Nico‘), isPaid: All(true), points: Sum(10), friends: [‘Franklin‘] })const acct2 = Map({ name: First(‘Nico‘), isPaid: All(false), points: Sum(2), friends: [‘Gatsby‘] })const res = acct1.concat(acct2)// Showing resultsconsole.log("Friend 1: ", res.toJS().friends[0]) //Friend 1: Franklinconsole.log("Friend 2: ", res.toJS().friends[1]) //Friend 2: Gatsbyconsole.log("isPaid: ", res.toJS().isPaid.x) //isPaid: falseconsole.log("Name: ", res.toJS().name.x) // Name: Nicoconsole.log("Points: ", res.toJS().points.x) // Points: 12
[JS Compose] 6. Semigroup examples
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。