Skip to content

Commit

Permalink
Added Either and Option type extractors (#2255)
Browse files Browse the repository at this point in the history
jessekelly881 authored Mar 6, 2024

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
1 parent 89b5d1c commit e466afe
Showing 5 changed files with 41 additions and 0 deletions.
5 changes: 5 additions & 0 deletions .changeset/odd-bikes-flow.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"effect": patch
---

added Either.Either.{Left,Right} and Option.Option.Value type utils
6 changes: 6 additions & 0 deletions packages/effect/dtslint/Either.ts
Original file line number Diff line number Diff line change
@@ -165,3 +165,9 @@ pipe(
_s: string
) => "b" as const)
)

// $ExpectType number
export type R = Either.Either.Right<typeof string$number>

// $ExpectType string
export type L = Either.Either.Left<typeof string$number>
3 changes: 3 additions & 0 deletions packages/effect/dtslint/Option.ts
Original file line number Diff line number Diff line change
@@ -195,3 +195,6 @@ numberOrString.pipe(Option.andThen(numberOrString))

// $ExpectType Option<string | number>
numberOrString.pipe(Option.andThen(() => numberOrString))

// $ExpectType string | number
export type V = Option.Option.Value<typeof numberOrString>
16 changes: 16 additions & 0 deletions packages/effect/src/Either.ts
Original file line number Diff line number Diff line change
@@ -90,6 +90,22 @@ export interface EitherTypeLambda extends TypeLambda {
readonly type: Either<this["Target"], this["Out1"]>
}

/**
* @since 2.0.0
*/
export declare namespace Either {
/**
* @since 2.0.0
* @category type-level
*/
export type Left<T extends Either<any, any>> = [T] extends [Either<infer _A, infer _E>] ? _E : never
/**
* @since 2.0.0
* @category type-level
*/
export type Right<T extends Either<any, any>> = [T] extends [Either<infer _A, infer _E>] ? _A : never
}

/**
* Constructs a new `Either` holding a `Right` value. This usually represents a successful value due to the right bias
* of this structure.
11 changes: 11 additions & 0 deletions packages/effect/src/Option.ts
Original file line number Diff line number Diff line change
@@ -75,6 +75,17 @@ export interface OptionUnify<A extends { [Unify.typeSymbol]?: any }> {
Option?: () => A[Unify.typeSymbol] extends Option<infer A0> | infer _ ? Option<A0> : never
}

/**
* @since 2.0.0
*/
export declare namespace Option {
/**
* @since 2.0.0
* @category type-level
*/
export type Value<T extends Option<any>> = [T] extends [Option<infer _A>] ? _A : never
}

/**
* @category models
* @since 2.0.0

0 comments on commit e466afe

Please sign in to comment.