Skip to content

Commit

Permalink
improve map api types to work with Writable
Browse files Browse the repository at this point in the history
  • Loading branch information
tim-smart committed Sep 22, 2023
1 parent b012032 commit 53d565e
Show file tree
Hide file tree
Showing 5 changed files with 126 additions and 15 deletions.
5 changes: 5 additions & 0 deletions .changeset/chilled-ants-dress.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@effect-rx/rx": patch
---

improve map api types to work with Writable
22 changes: 22 additions & 0 deletions docs/rx/Result.ts.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ Added in v1.0.0
- [Result (type alias)](#result-type-alias)
- [Result (namespace)](#result-namespace)
- [Variance (interface)](#variance-interface)
- [Failure (type alias)](#failure-type-alias)
- [Success (type alias)](#success-type-alias)
- [Success (interface)](#success-interface)
- [Waiting (interface)](#waiting-interface)
- [refinements](#refinements)
Expand Down Expand Up @@ -240,6 +242,26 @@ export interface Variance<E, A> {

Added in v1.0.0

### Failure (type alias)

**Signature**

```ts
export type Failure<R extends Result<any, any>> = R extends Result<infer E, infer _> ? E : never
```
Added in v1.0.0
### Success (type alias)
**Signature**
```ts
export type Success<R extends Result<any, any>> = R extends Result<infer _, infer A> ? A : never
```
Added in v1.0.0
## Success (interface)
**Signature**
Expand Down
50 changes: 45 additions & 5 deletions docs/rx/Rx.ts.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ Added in v1.0.0
- [Rx (namespace)](#rx-namespace)
- [Get (type alias)](#get-type-alias)
- [GetResult (type alias)](#getresult-type-alias)
- [Infer (type alias)](#infer-type-alias)
- [Mount (type alias)](#mount-type-alias)
- [Read (type alias)](#read-type-alias)
- [ReadFn (type alias)](#readfn-type-alias)
Expand All @@ -55,6 +56,8 @@ Added in v1.0.0
- [RxRuntime (interface)](#rxruntime-interface)
- [StreamPullResult (type alias)](#streampullresult-type-alias)
- [Writable (interface)](#writable-interface)
- [refinements](#refinements)
- [isWritable](#iswritable)
- [type ids](#type-ids)
- [RefreshableTypeId](#refreshabletypeid)
- [RefreshableTypeId (type alias)](#refreshabletypeid-type-alias)
Expand Down Expand Up @@ -107,7 +110,13 @@ Added in v1.0.0
**Signature**
```ts
export declare const map: { <A, B>(f: (_: A) => B): (self: Rx<A>) => Rx<B>; <A, B>(self: Rx<A>, f: (_: A) => B): Rx<B> }
export declare const map: (<R extends Rx<any>, B>(
f: (_: Rx.Infer<R>) => B
) => (self: R) => [R] extends [Writable<infer _, infer RW>] ? Writable<B, RW> : Rx<B>) &
(<R extends Rx<any>, B>(
self: R,
f: (_: Rx.Infer<R>) => B
) => [R] extends [Writable<infer _, infer RW>] ? Writable<B, RW> : Rx<B>)
```
Added in v1.0.0
Expand All @@ -117,10 +126,19 @@ Added in v1.0.0
**Signature**
```ts
export declare const mapResult: (<A, B>(
f: (_: A) => B
) => <E>(self: Rx<Result.Result<E, A>>) => Rx<Result.Result<E, B>>) &
(<E, A, B>(self: Rx<Result.Result<E, A>>, f: (_: A) => B) => Rx<Result.Result<E, B>>)
export declare const mapResult: (<R extends Rx<Result.Result<any, any>>, B>(
f: (_: Result.Result.Success<Rx.Infer<R>>) => B
) => (
self: R
) => [R] extends [Writable<infer _, infer RW>]
? Writable<Result.Result<Result.Result.Failure<Rx.Infer<R>>, B>, RW>
: Rx<Result.Result<Result.Result.Failure<Rx.Infer<R>>, B>>) &
(<R extends Rx<Result.Result<any, any>>, B>(
self: R,
f: (_: Result.Result.Success<Rx.Infer<R>>) => B
) => [R] extends [Writable<infer _, infer RW>]
? Writable<Result.Result<Result.Result.Failure<Rx.Infer<R>>, B>, RW>
: Rx<Result.Result<Result.Result.Failure<Rx.Infer<R>>, B>>)
```
Added in v1.0.0
Expand Down Expand Up @@ -420,6 +438,16 @@ export type GetResult = <E, A>(rx: Rx<Result.Result<E, A>>) => Exit.Exit<E | NoS
Added in v1.0.0
### Infer (type alias)
**Signature**
```ts
export type Infer<T extends Rx<any>> = T extends Rx<infer A> ? A : never
```
Added in v1.0.0
### Mount (type alias)
**Signature**
Expand Down Expand Up @@ -555,6 +583,18 @@ export interface Writable<R, W> extends Rx<R> {

Added in v1.0.0

# refinements

## isWritable

**Signature**

```ts
export declare const isWritable: <R, W>(rx: Rx<R>) => rx is Writable<R, W>
```
Added in v1.0.0
# type ids
## RefreshableTypeId
Expand Down
10 changes: 10 additions & 0 deletions packages/rx/src/Result.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,16 @@ export declare namespace Result {
readonly A: (_: never) => A
}
}

/**
* @since 1.0.0
*/
export type Success<R extends Result<any, any>> = R extends Result<infer _, infer A> ? A : never

/**
* @since 1.0.0
*/
export type Failure<R extends Result<any, any>> = R extends Result<infer E, infer _> ? E : never
}

const ResultProto = Data.struct({
Expand Down
54 changes: 44 additions & 10 deletions packages/rx/src/Rx.ts
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,11 @@ export declare namespace Rx {
export type Subscribe = <A>(rx: Rx<A>, f: (_: A) => void, options?: {
readonly immediate?: boolean
}) => () => void

/**
* @since 1.0.0
*/
export type Infer<T extends Rx<any>> = T extends Rx<infer A> ? A : never
}

/**
Expand Down Expand Up @@ -211,6 +216,12 @@ function defaultRefresh(this: Rx<any>, f: any) {
f(this)
}

/**
* @since 1.0.0
* @category refinements
*/
export const isWritable = <R, W>(rx: Rx<R>): rx is Writable<R, W> => WritableTypeId in rx

/**
* @since 1.0.0
* @category constructors
Expand Down Expand Up @@ -744,22 +755,45 @@ export const initialValue: {
* @since 1.0.0
* @category combinators
*/
export const map: {
<A, B>(f: (_: A) => B): (self: Rx<A>) => Rx<B>
<A, B>(self: Rx<A>, f: (_: A) => B): Rx<B>
} = dual<
<A, B>(f: (_: A) => B) => (self: Rx<A>) => Rx<B>,
<A, B>(self: Rx<A>, f: (_: A) => B) => Rx<B>
>(2, (self, f) => readable((get) => f(get(self))))
export const map = dual<
<R extends Rx<any>, B>(
f: (_: Rx.Infer<R>) => B
) => (self: R) => [R] extends [Writable<infer _, infer RW>] ? Writable<B, RW> : Rx<B>,
<R extends Rx<any>, B>(
self: R,
f: (_: Rx.Infer<R>) => B
) => [R] extends [Writable<infer _, infer RW>] ? Writable<B, RW> : Rx<B>
>(
2,
(<A, B>(self: Rx<A>, f: (_: A) => B): Rx<B> =>
isWritable(self)
? writable((get) => f(get(self)), function(ctx, value) {
ctx.set(self, value)
}, function(refresh) {
refresh(self)
})
: readable((get) => f(get(self)), function(refresh) {
refresh(self)
})) as any
)

/**
* @since 1.0.0
* @category combinators
*/
export const mapResult = dual<
<A, B>(f: (_: A) => B) => <E>(self: Rx<Result.Result<E, A>>) => Rx<Result.Result<E, B>>,
<E, A, B>(self: Rx<Result.Result<E, A>>, f: (_: A) => B) => Rx<Result.Result<E, B>>
>(2, (self, f) => map(self, Result.map(f)))
<R extends Rx<Result.Result<any, any>>, B>(
f: (_: Result.Result.Success<Rx.Infer<R>>) => B
) => (
self: R
) => [R] extends [Writable<infer _, infer RW>] ? Writable<Result.Result<Result.Result.Failure<Rx.Infer<R>>, B>, RW>
: Rx<Result.Result<Result.Result.Failure<Rx.Infer<R>>, B>>,
<R extends Rx<Result.Result<any, any>>, B>(
self: R,
f: (_: Result.Result.Success<Rx.Infer<R>>) => B
) => [R] extends [Writable<infer _, infer RW>] ? Writable<Result.Result<Result.Result.Failure<Rx.Infer<R>>, B>, RW>
: Rx<Result.Result<Result.Result.Failure<Rx.Infer<R>>, B>>
>(2, (self, f) => map(self, Result.map(f)) as any)

/**
* @since 1.0.0
Expand Down

0 comments on commit 53d565e

Please sign in to comment.