Skip to content

Commit

Permalink
feat: add basic fluent extensions for non tsplus projects
Browse files Browse the repository at this point in the history
  • Loading branch information
patroza committed Nov 30, 2023
1 parent 0ed12a1 commit 4c9e60a
Show file tree
Hide file tree
Showing 4 changed files with 127 additions and 0 deletions.
5 changes: 5 additions & 0 deletions .changeset/ninety-schools-fail.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@effect-app/prelude": patch
---

add basic fluent extensions for projects without tsplus
60 changes: 60 additions & 0 deletions packages/prelude/_src/fluent-extensions-ext.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import type { NoInfer } from "effect/Types"
import type * as Cause from "effect/Cause"
import type * as Runtime from "effect/Runtime"

// Put the following in the project, where RT is the default runtime context available
/*
import type * as Runtime from "effect/Runtime"
import type * as Fiber from "effect/Fiber"
declare module "effect/Effect" {
export interface Effect<R, E, A> {
get runPromise(this: Effect<RT, E, A>): Promise<A>
get runSync(this: Effect<RT, E, A>): A
runFork<E, A>(this: Effect<RT, E, A>, options?: Runtime.RunForkOptions): Fiber.RuntimeFiber<E, A>
}
}
*/

declare module "effect/Option" {
export interface None<out A> {
get value(this: None<A>): A | undefined
}
}

declare module "effect/Effect" {
export interface Effect<R, E, A> {
andThen<A, R, E, X>(
this: Effect<R, E, A>,
f: (a: NoInfer<A>) => X,
): [X] extends [Effect<infer R1, infer E1, infer A1>]
? Effect<R | R1, E | E1, A1>
: [X] extends [Promise<infer A1>]
? Effect<R, Cause.UnknownException | E, A1>
: Effect<R, E, X>

andThen<A, R, E, X>(
this: Effect<R, E, A>,
f: X,
): [X] extends [Effect<infer R1, infer E1, infer A1>]
? Effect<R | R1, E | E1, A1>
: [X] extends [Promise<infer A1>]
? Effect<R, Cause.UnknownException | E, A1>
: Effect<R, E, X>
tap<A, R, E, X>(
this: Effect<R, E, A>,
f: (a: NoInfer<A>) => X,
): [X] extends [Effect<infer R1, infer E1, infer _A1>]
? Effect<R | R1, E | E1, A>
: [X] extends [Promise<infer _A1>]
? Effect<R, Cause.UnknownException | E, A>
: Effect<R, E, A>
tap<A, R, E, X>(
this: Effect<R, E, A>,
f: X,
): [X] extends [Effect<infer R1, infer E1, infer _A1>]
? Effect<R | R1, E | E1, A>
: [X] extends [Promise<infer _A1>]
? Effect<R, Cause.UnknownException | E, A>
: Effect<R, E, A>
}
}
42 changes: 42 additions & 0 deletions packages/prelude/_src/fluent-extensions.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import type {} from "./fluent-extensions-ext.js"
import * as Effect from "effect/Effect"
import * as RT from "effect/Runtime"

/**
* useful in e.g frontend projects that do not use tsplus, but still has the most useful extensions installed.
*/
export const installFluentExtensions = <R>(runtime: Runtime<R>) => {
const runPromise = RT.runPromise(runtime)
const runFork = RT.runFork(runtime)
const runSync = RT.runSync(runtime)
Object.defineProperty(Object.prototype, "runPromise", {
enumerable: false,
get() {
return runPromise(this)
}
})
Object.defineProperty(Object.prototype, "runFork", {
enumerable: false,
value(arg: any) {
return runFork(this, arg)
}
})
Object.defineProperty(Object.prototype, "runSync", {
enumerable: false,
get() {
return runSync(this)
}
})
Object.defineProperty(Object.prototype, "andThen", {
enumerable: false,
value(arg: any) {
return Effect.andThen(this, arg)
}
})
Object.defineProperty(Object.prototype, "tap", {
enumerable: false,
value(arg: any) {
return Effect.tap(this, arg)
}
})
}
20 changes: 20 additions & 0 deletions packages/prelude/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -268,6 +268,26 @@
"default": "./_cjs/faker.cjs"
}
},
"./fluent-extensions": {
"import": {
"types": "./dist/fluent-extensions.d.ts",
"default": "./dist/fluent-extensions.js"
},
"require": {
"types": "./dist/fluent-extensions.d.ts",
"default": "./_cjs/fluent-extensions.cjs"
}
},
"./fluent-extensions-ext.d": {
"import": {
"types": "./dist/fluent-extensions-ext.d.d.ts",
"default": "./dist/fluent-extensions-ext.d.js"
},
"require": {
"types": "./dist/fluent-extensions-ext.d.d.ts",
"default": "./_cjs/fluent-extensions-ext.d.cjs"
}
},
"./ids": {
"import": {
"types": "./dist/ids.d.ts",
Expand Down

0 comments on commit 4c9e60a

Please sign in to comment.