diff --git a/src/either/either.test.ts b/src/either/either.test.ts index 3c91085..12427e6 100644 --- a/src/either/either.test.ts +++ b/src/either/either.test.ts @@ -141,7 +141,7 @@ describe('Either', () => { it('maps right type', () => { const expected = 'right' - const actual = adt.bimap(() => 'left', () => 'right') + const actual = adt.bimap(() => 'left', () => expected) expect(actual).toBeRight(expected) }) diff --git a/src/jest-matchers.ts b/src/jest-matchers.ts index 69dcf69..0051200 100644 --- a/src/jest-matchers.ts +++ b/src/jest-matchers.ts @@ -49,7 +49,7 @@ const getReportHeader = (fnName: string, pass: boolean) => `${matcherHint( const getExpectedMessage = (values: TestValues) => printExpected(`${values.side}(${values.expected.fold()})`) -const getReceivedMessage = (values: TestValues) => `Received: ${printReceived(values.received)}` +const getReceivedMessage = (values: TestValues) => `Received: ${printReceived(values.received.fold())}` const getExpectedValueMessage = (pass: boolean, values: TestValues) => `Expected value${pass ? ' not ' : ' '}to be: ${getExpectedMessage(values)}` diff --git a/src/maybe/maybe.test.ts b/src/maybe/maybe.test.ts index 372c800..d35ca11 100644 --- a/src/maybe/maybe.test.ts +++ b/src/maybe/maybe.test.ts @@ -176,6 +176,16 @@ describe('Maybe', () => { expect(actual).toBeRight(value) }) }) + + describe('bimap', () => { + it('maps just type', () => { + const expected = 'just' + + const actual = adt.bimap(() => 'none', () => expected) + + expect(actual).toBeJust(expected) + }) + }) }) describe('none', () => { @@ -309,6 +319,16 @@ describe('Maybe', () => { expect(actual).toBeLeft(expected) }) }) + + describe('bimap', () => { + it('maps none type', () => { + const expected = 'none' + + const actual = adt.bimap(() => expected, () => 'just') + + expect(actual).toBeJust(expected) + }) + }) }) describe('maybe', () => { diff --git a/src/maybe/maybe.ts b/src/maybe/maybe.ts index 2bd32b2..14f95ea 100644 --- a/src/maybe/maybe.ts +++ b/src/maybe/maybe.ts @@ -22,6 +22,7 @@ export const just = (value: NonNullable>): Maybe => flatMap: (ifJust) => maybe(ifJust(data)), mapIf: (predicate, ifTrue) => (predicate(data) ? maybe(ifTrue(data)) : maybe(data)), orElse: () => maybe(data), + bimap: (_, ifJust) => maybe(ifJust(data)), toEither: () => right(data), }) ) @@ -45,6 +46,7 @@ export const none = once( mapIf: () => none(), orElse: (ifNone) => maybe(ifNone()), fold: (ifNone?: () => B) => (ifNone ? ifNone() : NONE_VALUE), + bimap: (ifNone) => maybe(ifNone()), toEither: (ifNone) => left(ifNone()) }) ) diff --git a/src/maybe/maybe.types.ts b/src/maybe/maybe.types.ts index a6a0884..422b1bd 100644 --- a/src/maybe/maybe.types.ts +++ b/src/maybe/maybe.types.ts @@ -1,5 +1,5 @@ -import { Serializer } from "../utils/serializer"; -import { Either, LeftValueOrEither } from "../either/either.types"; +import { Serializer } from '../utils/serializer' +import { Either, LeftValueOrEither } from '../either/either.types' export type AnyMaybe = Maybe @@ -7,14 +7,21 @@ export type ValueOrMaybe = A | Maybe | undefined | null interface MaybeProto extends Serializer { equals(value: AnyMaybe): boolean + flatMap(ifJust: (just: A) => ValueOrMaybe): Maybe + mapIf(predicate: (just: A) => boolean, ifTrue: (just: A) => ValueOrMaybe): Maybe + orElse(ifNone: () => ValueOrMaybe): Maybe + + bimap(ifNone: () => ValueOrMaybe, ifJust: (just: A) => ValueOrMaybe): Maybe + toEither(ifNone: () => LeftValueOrEither): Either } interface Fold { fold(): T + fold(ifNone: () => B, ifJust: (just: A) => B): B }