Skip to content

Commit

Permalink
add getIntercalateSemigroup
Browse files Browse the repository at this point in the history
  • Loading branch information
gcanti committed Feb 13, 2020
1 parent 77157b1 commit 5432531
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 1 deletion.
19 changes: 19 additions & 0 deletions src/Semigroup.ts
Expand Up @@ -177,3 +177,22 @@ export const semigroupString: Semigroup<string> = {
export const semigroupVoid: Semigroup<void> = {
concat: () => undefined
}

/**
* You can glue items between and stay associative
*
* @example
* import { getIntercalateSemigroup, semigroupString } from 'fp-ts/lib/Semigroup'
*
* const S = getIntercalateSemigroup(' ')(semigroupString)
*
* assert.strictEqual(S.concat('a', 'b'), 'a b')
* assert.strictEqual(S.concat(S.concat('a', 'b'), 'c'), S.concat('a', S.concat('b', 'c')))
*
* @since 2.5.0
*/
export function getIntercalateSemigroup<A>(a: A): (S: Semigroup<A>) => Semigroup<A> {
return S => ({
concat: (x, y) => S.concat(x, S.concat(a, y))
})
}
9 changes: 8 additions & 1 deletion test/Semigroup.ts
Expand Up @@ -13,7 +13,8 @@ import {
semigroupString,
semigroupSum,
semigroupVoid,
getDualSemigroup
getDualSemigroup,
getIntercalateSemigroup
} from '../src/Semigroup'

describe('Semigroup', () => {
Expand Down Expand Up @@ -71,4 +72,10 @@ describe('Semigroup', () => {
const S = getDualSemigroup(semigroupString)
assert.deepStrictEqual(S.concat('a', 'b'), 'ba')
})

it('getIntercalateSemigroup', () => {
const S = getIntercalateSemigroup(' ')(semigroupString)
assert.strictEqual(S.concat('a', 'b'), 'a b')
assert.strictEqual(S.concat(S.concat('a', 'b'), 'c'), S.concat('a', S.concat('b', 'c')))
})
})

0 comments on commit 5432531

Please sign in to comment.