[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 results console.log("Friend 1: ", res.toJS().friends[0]) //Friend 1: Franklin console.log("Friend 2: ", res.toJS().friends[1]) //Friend 2: Gatsby console.log("isPaid: ", res.toJS().isPaid.x) //isPaid: false console.log("Name: ", res.toJS().name.x) // Name: Nico console.log("Points: ", res.toJS().points.x) // Points: 12