Skip to content

Commit 28868ea

Browse files
committed
Optional: add missing fromNullable combinator, closes #133
1 parent 74dba26 commit 28868ea

File tree

5 files changed

+44
-10
lines changed

5 files changed

+44
-10
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ high state of flux, you're at risk of it changing without notice.
1919
- `Prism`
2020
- (\*) remove `fromSome` constructor (@gcanti)
2121
- (\*) change `fromNullable` signature (@gcanti)
22+
- `Optional`
23+
- add missing `fromNullable` combinator, closes #133 (@gcanti)
2224

2325
(\*) breaking change
2426

docs/modules/Optional.ts.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ Added in v2.3.0
3737
- [component](#component)
3838
- [filter](#filter)
3939
- [findFirst](#findfirst)
40+
- [fromNullable](#fromnullable)
4041
- [index](#index)
4142
- [key](#key)
4243
- [left](#left)
@@ -126,6 +127,18 @@ export declare const findFirst: <A>(predicate: Predicate<A>) => <S>(sa: Optional
126127

127128
Added in v2.3.2
128129

130+
## fromNullable
131+
132+
Return an `Optional` from a `Optional` focused on a nullable value
133+
134+
**Signature**
135+
136+
```ts
137+
export declare const fromNullable: <S, A>(sa: Optional<S, A>) => Optional<S, NonNullable<A>>
138+
```
139+
140+
Added in v2.3.3
141+
129142
## index
130143

131144
Return a `Optional` from a `Optional` focused on a `ReadonlyArray`

src/Optional.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,16 @@ export const modifyOption: <A>(f: (a: A) => A) => <S>(optional: Optional<S, A>)
100100
*/
101101
export const modify: <A>(f: (a: A) => A) => <S>(optional: Optional<S, A>) => (s: S) => S = _.optionalModify
102102

103+
/**
104+
* Return an `Optional` from a `Optional` focused on a nullable value
105+
*
106+
* @category combinators
107+
* @since 2.3.3
108+
*/
109+
export const fromNullable: <S, A>(sa: Optional<S, A>) => Optional<S, NonNullable<A>> =
110+
/*#__PURE__*/
111+
compose(_.prismAsOptional(_.prismFromNullable()))
112+
103113
/**
104114
* @category combinators
105115
* @since 2.3.0

src/Prism.ts

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,12 @@ export const composeOptional = <A, B>(ab: Optional<A, B>) => <S>(sa: Prism<S, A>
120120
// combinators
121121
// -------------------------------------------------------------------------------------
122122

123+
/**
124+
* @category combinators
125+
* @since 2.3.0
126+
*/
127+
export const set: <A>(a: A) => <S>(sa: Prism<S, A>) => (s: S) => S = _.prismSet
128+
123129
/**
124130
* @category combinators
125131
* @since 2.3.0
@@ -142,16 +148,6 @@ export const fromNullable: <S, A>(sa: Prism<S, A>) => Prism<S, NonNullable<A>> =
142148
/*#__PURE__*/
143149
compose(_.prismFromNullable())
144150

145-
/**
146-
* @category combinators
147-
* @since 2.3.0
148-
*/
149-
export const set: <A>(a: A) => <S>(sa: Prism<S, A>) => (s: S) => S = _.prismSet
150-
151-
// -------------------------------------------------------------------------------------
152-
// combinators
153-
// -------------------------------------------------------------------------------------
154-
155151
/**
156152
* @category combinators
157153
* @since 2.3.0

test/Optional.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,4 +142,17 @@ describe('Optional', () => {
142142
)
143143
assert.deepStrictEqual(modify(O.some({ a: ['a'] })), O.some({ a: ['A'] }))
144144
})
145+
146+
it('fromNullable', () => {
147+
interface S {
148+
a?: number
149+
}
150+
const sa = pipe(_.id<S>(), _.prop('a'), _.fromNullable)
151+
assert.deepStrictEqual(sa.getOption({}), O.none)
152+
assert.deepStrictEqual(sa.getOption({ a: undefined }), O.none)
153+
assert.deepStrictEqual(sa.getOption({ a: 1 }), O.some(1))
154+
assert.deepStrictEqual(sa.set(2)({}), {})
155+
assert.deepStrictEqual(sa.set(2)({ a: undefined }), { a: undefined })
156+
assert.deepStrictEqual(sa.set(2)({ a: 1 }), { a: 2 })
157+
})
145158
})

0 commit comments

Comments
 (0)