Skip to content

Commit

Permalink
Added bimap to maybe
Browse files Browse the repository at this point in the history
  • Loading branch information
Matteo Antoci committed Feb 14, 2021
1 parent 0a6df25 commit 8058617
Show file tree
Hide file tree
Showing 5 changed files with 33 additions and 4 deletions.
2 changes: 1 addition & 1 deletion src/either/either.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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)
})
Expand Down
2 changes: 1 addition & 1 deletion src/jest-matchers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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)}`
Expand Down
20 changes: 20 additions & 0 deletions src/maybe/maybe.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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', () => {
Expand Down Expand Up @@ -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', () => {
Expand Down
2 changes: 2 additions & 0 deletions src/maybe/maybe.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ export const just = <A>(value: NonNullable<ValueOrMaybe<A>>): Maybe<A> =>
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),
})
)
Expand All @@ -45,6 +46,7 @@ export const none = once(
mapIf: <B>() => none<B>(),
orElse: (ifNone) => maybe(ifNone()),
fold: <B>(ifNone?: () => B) => (ifNone ? ifNone() : NONE_VALUE),
bimap: (ifNone) => maybe(ifNone()),
toEither: (ifNone) => left(ifNone())
})
)
Expand Down
11 changes: 9 additions & 2 deletions src/maybe/maybe.types.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,27 @@
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<any>

export type ValueOrMaybe<A> = A | Maybe<A> | undefined | null

interface MaybeProto<A> extends Serializer {
equals(value: AnyMaybe): boolean

flatMap<B>(ifJust: (just: A) => ValueOrMaybe<B>): Maybe<B>

mapIf(predicate: (just: A) => boolean, ifTrue: (just: A) => ValueOrMaybe<A>): Maybe<A>

orElse(ifNone: () => ValueOrMaybe<A>): Maybe<A>

bimap<B>(ifNone: () => ValueOrMaybe<B>, ifJust: (just: A) => ValueOrMaybe<B>): Maybe<B>

toEither<E>(ifNone: () => LeftValueOrEither<E>): Either<E, A>
}

interface Fold<A, T> {
fold(): T

fold<B>(ifNone: () => B, ifJust: (just: A) => B): B
}

Expand Down

0 comments on commit 8058617

Please sign in to comment.