@typed/template 0.5.4 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/dist/cjs/ElementRef.js.map +1 -1
  2. package/dist/cjs/ElementSource.js.map +1 -1
  3. package/dist/cjs/Html.js.map +1 -1
  4. package/dist/cjs/Many.js.map +1 -1
  5. package/dist/cjs/RenderContext.js.map +1 -1
  6. package/dist/cjs/RenderTemplate.js.map +1 -1
  7. package/dist/cjs/Test.js.map +1 -1
  8. package/dist/cjs/internal/EventSource.js.map +1 -1
  9. package/dist/cjs/internal/hydrate.js.map +1 -1
  10. package/dist/cjs/internal/indexRefCounter.js.map +1 -1
  11. package/dist/cjs/internal/parts.js.map +1 -1
  12. package/dist/cjs/internal/render.js +3 -2
  13. package/dist/cjs/internal/render.js.map +1 -1
  14. package/dist/cjs/internal/server.js +2 -6
  15. package/dist/cjs/internal/server.js.map +1 -1
  16. package/dist/dts/Directive.d.ts +14 -14
  17. package/dist/dts/Directive.d.ts.map +1 -1
  18. package/dist/dts/ElementRef.d.ts +7 -7
  19. package/dist/dts/ElementRef.d.ts.map +1 -1
  20. package/dist/dts/ElementSource.d.ts +5 -5
  21. package/dist/dts/ElementSource.d.ts.map +1 -1
  22. package/dist/dts/EventHandler.d.ts +12 -12
  23. package/dist/dts/EventHandler.d.ts.map +1 -1
  24. package/dist/dts/Html.d.ts +2 -2
  25. package/dist/dts/Html.d.ts.map +1 -1
  26. package/dist/dts/Hydrate.d.ts +2 -2
  27. package/dist/dts/Hydrate.d.ts.map +1 -1
  28. package/dist/dts/Many.d.ts +8 -8
  29. package/dist/dts/Many.d.ts.map +1 -1
  30. package/dist/dts/Part.d.ts +14 -14
  31. package/dist/dts/Part.d.ts.map +1 -1
  32. package/dist/dts/Placeholder.d.ts +6 -6
  33. package/dist/dts/Placeholder.d.ts.map +1 -1
  34. package/dist/dts/Platform.d.ts +1 -1
  35. package/dist/dts/Platform.d.ts.map +1 -1
  36. package/dist/dts/Render.d.ts +2 -2
  37. package/dist/dts/Render.d.ts.map +1 -1
  38. package/dist/dts/RenderContext.d.ts +5 -5
  39. package/dist/dts/RenderContext.d.ts.map +1 -1
  40. package/dist/dts/RenderTemplate.d.ts +2 -2
  41. package/dist/dts/RenderTemplate.d.ts.map +1 -1
  42. package/dist/dts/Renderable.d.ts +3 -3
  43. package/dist/dts/Renderable.d.ts.map +1 -1
  44. package/dist/dts/Test.d.ts +12 -12
  45. package/dist/dts/Test.d.ts.map +1 -1
  46. package/dist/dts/Vitest.d.ts +2 -2
  47. package/dist/dts/Vitest.d.ts.map +1 -1
  48. package/dist/dts/internal/EventSource.d.ts +2 -2
  49. package/dist/dts/internal/EventSource.d.ts.map +1 -1
  50. package/dist/dts/internal/hydrate.d.ts.map +1 -1
  51. package/dist/dts/internal/indexRefCounter.d.ts +5 -5
  52. package/dist/dts/internal/indexRefCounter.d.ts.map +1 -1
  53. package/dist/dts/internal/module-augmentation.d.ts +13 -13
  54. package/dist/dts/internal/module-augmentation.d.ts.map +1 -1
  55. package/dist/dts/internal/parts.d.ts +39 -39
  56. package/dist/dts/internal/parts.d.ts.map +1 -1
  57. package/dist/dts/internal/render.d.ts +1 -1
  58. package/dist/dts/internal/render.d.ts.map +1 -1
  59. package/dist/dts/internal/server.d.ts +2 -2
  60. package/dist/dts/internal/server.d.ts.map +1 -1
  61. package/dist/dts/internal/utils.d.ts +1 -1
  62. package/dist/esm/ElementRef.js.map +1 -1
  63. package/dist/esm/ElementSource.js.map +1 -1
  64. package/dist/esm/Html.js.map +1 -1
  65. package/dist/esm/Many.js.map +1 -1
  66. package/dist/esm/RenderContext.js.map +1 -1
  67. package/dist/esm/RenderTemplate.js.map +1 -1
  68. package/dist/esm/Test.js.map +1 -1
  69. package/dist/esm/internal/EventSource.js.map +1 -1
  70. package/dist/esm/internal/hydrate.js.map +1 -1
  71. package/dist/esm/internal/indexRefCounter.js.map +1 -1
  72. package/dist/esm/internal/parts.js +4 -4
  73. package/dist/esm/internal/parts.js.map +1 -1
  74. package/dist/esm/internal/render.js +3 -2
  75. package/dist/esm/internal/render.js.map +1 -1
  76. package/dist/esm/internal/server.js +2 -6
  77. package/dist/esm/internal/server.js.map +1 -1
  78. package/package.json +8 -16
  79. package/src/Directive.ts +24 -24
  80. package/src/ElementRef.ts +11 -11
  81. package/src/ElementSource.ts +18 -18
  82. package/src/EventHandler.ts +18 -18
  83. package/src/Html.ts +33 -33
  84. package/src/Hydrate.ts +4 -4
  85. package/src/Many.ts +26 -26
  86. package/src/Part.ts +14 -14
  87. package/src/Placeholder.ts +13 -13
  88. package/src/Platform.ts +3 -3
  89. package/src/Render.ts +5 -5
  90. package/src/RenderContext.ts +8 -8
  91. package/src/RenderTemplate.ts +2 -6
  92. package/src/Renderable.ts +6 -6
  93. package/src/Test.ts +13 -13
  94. package/src/Vitest.ts +2 -2
  95. package/src/internal/EventSource.ts +4 -4
  96. package/src/internal/hydrate.ts +3 -7
  97. package/src/internal/indexRefCounter.ts +9 -17
  98. package/src/internal/module-augmentation.ts +15 -15
  99. package/src/internal/parts.ts +61 -63
  100. package/src/internal/render.ts +29 -28
  101. package/src/internal/server.ts +8 -10
  102. package/TemplateInstance/package.json +0 -6
  103. package/dist/cjs/TemplateInstance.js +0 -51
  104. package/dist/cjs/TemplateInstance.js.map +0 -1
  105. package/dist/dts/TemplateInstance.d.ts +0 -33
  106. package/dist/dts/TemplateInstance.d.ts.map +0 -1
  107. package/dist/esm/TemplateInstance.js +0 -43
  108. package/dist/esm/TemplateInstance.js.map +0 -1
  109. package/src/TemplateInstance.ts +0 -83
@@ -21,7 +21,7 @@ export type PlaceholderTypeId = typeof PlaceholderTypeId
21
21
  /**
22
22
  * @since 1.0.0
23
23
  */
24
- export interface Placeholder<out R = never, out E = never, out A = unknown> {
24
+ export interface Placeholder<A = unknown, E = never, R = never> {
25
25
  readonly [PlaceholderTypeId]: {
26
26
  readonly _R: (_: never) => R
27
27
  readonly _E: (_: never) => E
@@ -37,32 +37,32 @@ export namespace Placeholder {
37
37
  * @since 1.0.0
38
38
  */
39
39
  export type Any<A = any> =
40
- | Placeholder<any, any, A>
41
- | Placeholder<any, never, A>
42
- | Placeholder<never, never, A>
43
- | Placeholder<never, any, A>
40
+ | Placeholder<A, any, any>
41
+ | Placeholder<A, never, any>
42
+ | Placeholder<A>
43
+ | Placeholder<A, any>
44
44
 
45
45
  /**
46
46
  * @since 1.0.0
47
47
  */
48
- export type Context<T> = [T] extends [never] ? never : T extends Placeholder<infer R, infer _E, infer _A> ? R : never
48
+ export type Context<T> = [T] extends [never] ? never : T extends Placeholder<infer _A, infer _E, infer R> ? R : never
49
49
  /**
50
50
  * @since 1.0.0
51
51
  */
52
- export type Error<T> = [T] extends [never] ? never : T extends Placeholder<infer _R, infer E, infer _A> ? E : never
52
+ export type Error<T> = [T] extends [never] ? never : T extends Placeholder<infer _A, infer E, infer _R> ? E : never
53
53
  /**
54
54
  * @since 1.0.0
55
55
  */
56
- export type Success<T> = [T] extends [never] ? never : T extends Placeholder<infer _R, infer _E, infer A> ? A : never
56
+ export type Success<T> = [T] extends [never] ? never : T extends Placeholder<infer A, infer _E, infer _R> ? A : never
57
57
 
58
58
  /**
59
59
  * @since 1.0.0
60
60
  */
61
- export function asRef<R = never, E = never, A = never>(
62
- placeholder: Placeholder<R, E, A> | Fx<R, E, A> | Effect.Effect<R, E, A> | A
63
- ): Effect.Effect<R | Scope.Scope, never, RefSubject.RefSubject<never, E, A>> {
64
- if (isFx<R, E, A>(placeholder) || Effect.isEffect(placeholder)) {
65
- return RefSubject.make(placeholder as Fx<R, E, A>)
61
+ export function asRef<A = never, E = never, R = never>(
62
+ placeholder: Placeholder<A, E, R> | Fx<A, E, R> | Effect.Effect<A, E, R> | A
63
+ ): Effect.Effect<RefSubject.RefSubject<A, E>, never, R | Scope.Scope> {
64
+ if (isFx<A, E, R>(placeholder) || Effect.isEffect(placeholder)) {
65
+ return RefSubject.make(placeholder as Fx<A, E, R>)
66
66
  } else {
67
67
  return RefSubject.of<A, E>(placeholder as A)
68
68
  }
package/src/Platform.ts CHANGED
@@ -20,10 +20,10 @@ const HYPHENATED_CONTENT_TYPE = { "content-type": HTML_CONTENT_TYPE }
20
20
  /**
21
21
  * @since 1.0.0
22
22
  */
23
- export function htmlResponse<R, E>(
24
- fx: Fx.Fx<R, E, RenderEvent>,
23
+ export function htmlResponse<E, R>(
24
+ fx: Fx.Fx<RenderEvent, E, R>,
25
25
  options?: HttpServer.response.Options
26
- ): Effect.Effect<RenderContext.RenderContext | Exclude<R, RenderTemplate>, E, HttpServer.response.ServerResponse> {
26
+ ): Effect.Effect<HttpServer.response.ServerResponse, E, RenderContext.RenderContext | Exclude<R, RenderTemplate>> {
27
27
  return Effect.contextWithEffect((ctx) =>
28
28
  HttpServer.response.stream(
29
29
  Stream.provideContext(Stream.encodeText(toStream(renderToHtml(fx))), ctx),
package/src/Render.ts CHANGED
@@ -23,8 +23,8 @@ export type ToRendered<T extends RenderEvent | null> = T extends null ? Rendered
23
23
  * @since 1.0.0
24
24
  */
25
25
  export function render<R, E, T extends RenderEvent | null>(
26
- rendered: Fx.Fx<R, E, T>
27
- ): Fx.Fx<Exclude<R, RenderTemplate> | Document | RenderContext | RootElement, E, ToRendered<T>> {
26
+ rendered: Fx.Fx<T, E, R>
27
+ ): Fx.Fx<ToRendered<T>, E, Exclude<R, RenderTemplate> | Document | RenderContext | RootElement> {
28
28
  return Fx.fromFxEffect(Effect.contextWith((context) => {
29
29
  const [document, ctx, { rootElement }] = Context.getMany(context, Document, RenderContext, RootElement)
30
30
 
@@ -40,11 +40,11 @@ export function render<R, E, T extends RenderEvent | null>(
40
40
  * @since 1.0.0
41
41
  */
42
42
  export function renderLayer<R, E, T extends RenderEvent | null>(
43
- rendered: Fx.Fx<R, E, T>
43
+ rendered: Fx.Fx<T, E, R>
44
44
  ): Layer.Layer<
45
- Document | RenderContext | RootElement | Exclude<Exclude<R, RenderTemplate>, Scope.Scope>,
46
45
  never,
47
- never
46
+ never,
47
+ Document | RenderContext | RootElement | Exclude<Exclude<R, RenderTemplate>, Scope.Scope>
48
48
  > {
49
49
  return Fx.drainLayer(Fx.switchMapCause(render(rendered), (e) => Fx.fromEffect(Effect.logError(e))))
50
50
  }
@@ -57,7 +57,7 @@ export const RenderContext: Context.Tagged<RenderContext, RenderContext> = Conte
57
57
  * @since 1.0.0
58
58
  */
59
59
  export interface RenderQueue {
60
- readonly add: (part: unknown, task: () => void) => Effect.Effect<Scope.Scope, never, void>
60
+ readonly add: (part: unknown, task: () => void) => Effect.Effect<void, never, Scope.Scope>
61
61
  }
62
62
 
63
63
  /**
@@ -120,7 +120,7 @@ const buildWithCurrentEnvironment = (environment: Environment, skipRenderSchedul
120
120
  export const dom: (
121
121
  window: Window & GlobalThis,
122
122
  options?: DomServicesElementParams & { readonly skipRenderScheduling?: boolean }
123
- ) => Layer.Layer<never, never, RenderContext | CurrentEnvironment | DomServices> = (window, options) =>
123
+ ) => Layer.Layer<RenderContext | CurrentEnvironment | DomServices> = (window, options) =>
124
124
  Layer.provideMerge(
125
125
  Layer.mergeAll(
126
126
  buildWithCurrentEnvironment(
@@ -135,11 +135,11 @@ export const dom: (
135
135
  /**
136
136
  * @since 1.0.0
137
137
  */
138
- export const server: Layer.Layer<never, never, RenderContext | CurrentEnvironment> = buildWithCurrentEnvironment(
138
+ export const server: Layer.Layer<RenderContext | CurrentEnvironment> = buildWithCurrentEnvironment(
139
139
  "server"
140
140
  )
141
141
 
142
- const static_: Layer.Layer<never, never, RenderContext | CurrentEnvironment> = buildWithCurrentEnvironment("static")
142
+ const static_: Layer.Layer<RenderContext | CurrentEnvironment> = buildWithCurrentEnvironment("static")
143
143
 
144
144
  export {
145
145
  /**
@@ -151,7 +151,7 @@ export {
151
151
  class RenderQueueImpl implements RenderQueue {
152
152
  queue = new Map<unknown, () => void>()
153
153
  scheduled = false
154
- run: Effect.Effect<Scope.Scope, never, void>
154
+ run: Effect.Effect<void, never, Scope.Scope>
155
155
 
156
156
  constructor(
157
157
  readonly scope: Scope.Scope,
@@ -196,7 +196,7 @@ class RenderQueueImpl implements RenderQueue {
196
196
  )
197
197
  })
198
198
 
199
- runIdle: Effect.Effect<Scope.Scope, never, void> = Effect.suspend(() => {
199
+ runIdle: Effect.Effect<void, never, Scope.Scope> = Effect.suspend(() => {
200
200
  return Effect.flatMap(
201
201
  Idle.whenIdle(this.options),
202
202
  (deadline) =>
@@ -219,8 +219,8 @@ class RenderQueueImpl implements RenderQueue {
219
219
  )
220
220
  })
221
221
 
222
- runAnimationFrame: Effect.Effect<Scope.Scope, never, void> = Effect.zipRight(
223
- Effect.asyncOption<never, never, void>((cb) => {
222
+ runAnimationFrame: Effect.Effect<void, never, Scope.Scope> = Effect.zipRight(
223
+ Effect.asyncOption<void>((cb) => {
224
224
  const id = requestAnimationFrame(() => cb(Effect.unit))
225
225
  return Option.some(Effect.sync(() => cancelAnimationFrame(id)))
226
226
  }),
@@ -16,11 +16,7 @@ export interface RenderTemplate {
16
16
  <Values extends ReadonlyArray<Renderable<any, any>>>(
17
17
  templateStrings: TemplateStringsArray,
18
18
  values: Values
19
- ): Fx.Fx<
20
- Scope | Placeholder.Context<Values[number]>,
21
- Placeholder.Error<Values[number]>,
22
- RenderEvent
23
- >
19
+ ): Fx.Fx<RenderEvent, Placeholder.Error<Values[number]>, Scope | Placeholder.Context<Values[number]>>
24
20
  }
25
21
 
26
22
  /**
@@ -38,6 +34,6 @@ export const RenderTemplate: Context.Tagged<RenderTemplate, RenderTemplate> = Co
38
34
  export function html<const Values extends ReadonlyArray<Renderable<any, any>>>(
39
35
  template: TemplateStringsArray,
40
36
  ...values: Values
41
- ): Fx.Fx<RenderTemplate | Scope | Placeholder.Context<Values[number]>, Placeholder.Error<Values[number]>, RenderEvent> {
37
+ ): Fx.Fx<RenderEvent, Placeholder.Error<Values[number]>, RenderTemplate | Scope | Placeholder.Context<Values[number]>> {
42
38
  return Fx.fromFxEffect(RenderTemplate.with((render) => render(template, values)))
43
39
  }
package/src/Renderable.ts CHANGED
@@ -12,12 +12,12 @@ import type { RenderEvent } from "./RenderEvent.js"
12
12
  */
13
13
  export type Renderable<R = never, E = never> =
14
14
  | Renderable.Value
15
- | Placeholder<R, E, any>
16
- | { readonly [key: string]: Renderable<R, E> | Placeholder<R, E, any> | unknown } // TODO: Should we manage data attributes this way?
17
- | Placeholder<R, E, any>
18
- | Effect<R, E, any>
19
- | Fx<R, E, any>
20
- | ReadonlyArray<Renderable<R, E>>
15
+ | Placeholder<any, E, R>
16
+ | { readonly [key: string]: Renderable<E, R> | Placeholder<any, E, R> | unknown } // TODO: Should we manage data attributes this way?
17
+ | Placeholder<any, E, R>
18
+ | Effect<any, E, R>
19
+ | Fx<any, E, R>
20
+ | ReadonlyArray<Renderable<E, R>>
21
21
 
22
22
  /**
23
23
  * @since 1.0.0
package/src/Test.ts CHANGED
@@ -42,32 +42,32 @@ export interface TestRender<E> {
42
42
  readonly window: Window & GlobalThis
43
43
  readonly document: Document
44
44
  readonly elementRef: ElementRef.ElementRef
45
- readonly errors: RefSubject.Computed<never, never, ReadonlyArray<E>>
46
- readonly lastError: RefSubject.Filtered<never, never, E>
47
- readonly interrupt: Effect.Effect<never, never, void>
45
+ readonly errors: RefSubject.Computed<ReadonlyArray<E>>
46
+ readonly lastError: RefSubject.Filtered<E>
47
+ readonly interrupt: Effect.Effect<void>
48
48
  readonly makeEvent: (type: string, eventInitDict?: EventInit) => Event
49
49
  readonly makeCustomEvent: <A>(type: string, eventInitDict?: CustomEventInit<A>) => CustomEvent<A>
50
- readonly dispatchEvent: (options: EventOptions) => Effect.Effect<never, Cause.NoSuchElementException, void>
51
- readonly click: (options?: Omit<EventOptions, "event">) => Effect.Effect<never, Cause.NoSuchElementException, void>
50
+ readonly dispatchEvent: (options: EventOptions) => Effect.Effect<void, Cause.NoSuchElementException>
51
+ readonly click: (options?: Omit<EventOptions, "event">) => Effect.Effect<void, Cause.NoSuchElementException>
52
52
  }
53
53
 
54
54
  /**
55
55
  * @since 1.0.0
56
56
  */
57
- export function testRender<R, E>(
58
- fx: Fx.Fx<R, E, RenderEvent>,
57
+ export function testRender<E, R>(
58
+ fx: Fx.Fx<RenderEvent, E, R>,
59
59
  options?:
60
60
  & HappyDOMOptions
61
61
  & { readonly [K in keyof DomServicesElementParams]?: (document: Document) => DomServicesElementParams[K] }
62
62
  ): Effect.Effect<
63
- Scope.Scope | Exclude<Exclude<R, RenderTemplate>, RenderContext.RenderContext | CurrentEnvironment | DomServices>,
63
+ TestRender<E>,
64
64
  never,
65
- TestRender<E>
65
+ Scope.Scope | Exclude<Exclude<R, RenderTemplate>, RenderContext.RenderContext | CurrentEnvironment | DomServices>
66
66
  > {
67
67
  return Effect.gen(function*(_) {
68
68
  const window = yield* _(getOrMakeWindow(options))
69
69
  const elementRef = yield* _(ElementRef.make())
70
- const errors = yield* _(RefSubject.make<never, never, ReadonlyArray<E>>(Effect.succeed([])))
70
+ const errors = yield* _(RefSubject.make<ReadonlyArray<E>>(Effect.succeed([])))
71
71
  const fiber = yield* _(
72
72
  fx,
73
73
  render,
@@ -155,7 +155,7 @@ export function click<E>(
155
155
 
156
156
  function getOrMakeWindow(
157
157
  options?: HappyDOMOptions
158
- ): Effect.Effect<Scope.Scope, never, Window & GlobalThis> {
158
+ ): Effect.Effect<Window & GlobalThis, never, Scope.Scope> {
159
159
  if (typeof window !== "undefined" && typeof document !== "undefined") {
160
160
  return Effect.gen(function*(_) {
161
161
  window.document.head.innerHTML = ""
@@ -187,7 +187,7 @@ export interface TestHydrate<E, Elements> extends TestRender<E> {
187
187
  * @since 1.0.0
188
188
  */
189
189
  export function testHydrate<R, E, Elements>(
190
- fx: Fx.Fx<R, E, RenderEvent>,
190
+ fx: Fx.Fx<RenderEvent, E, R>,
191
191
  f: (rendered: Rendered, window: Window & GlobalThis) => Elements,
192
192
  options?:
193
193
  & HappyDOMOptions
@@ -218,7 +218,7 @@ export function testHydrate<R, E, Elements>(
218
218
  const elements = f(rendered.length === 1 ? rendered[0] : rendered, window)
219
219
 
220
220
  const elementRef = yield* _(ElementRef.make())
221
- const errors = yield* _(RefSubject.make<never, never, ReadonlyArray<E>>(Effect.succeed([])))
221
+ const errors = yield* _(RefSubject.make<ReadonlyArray<E>>(Effect.succeed([])))
222
222
  const fiber = yield* _(
223
223
  fx,
224
224
  hydrate,
package/src/Vitest.ts CHANGED
@@ -24,7 +24,7 @@ export {
24
24
  */
25
25
  export function it<E, A>(
26
26
  name: string,
27
- test: () => Effect.Effect<Scope, E, A>,
27
+ test: () => Effect.Effect<A, E, Scope>,
28
28
  options?: vitest.TestOptions
29
29
  ) {
30
30
  return vitest.it(
@@ -45,7 +45,7 @@ export function test<E, A>(
45
45
  name: string,
46
46
  test: (options: {
47
47
  readonly clock: TestClock.TestClock
48
- }) => Effect.Effect<Scope | TestServices.TestServices, E, A>,
48
+ }) => Effect.Effect<A, E, Scope | TestServices.TestServices>,
49
49
  options?: vitest.TestOptions
50
50
  ) {
51
51
  return vitest.it(
@@ -7,7 +7,7 @@ import type { EventHandler } from "../EventHandler.js"
7
7
 
8
8
  type EventName = string
9
9
 
10
- type Handler<Ev extends Event> = EventHandler<never, never, Ev>
10
+ type Handler<Ev extends Event> = EventHandler<Ev>
11
11
 
12
12
  export interface EventSource {
13
13
  readonly addEventListener: <Ev extends Event>(
@@ -16,11 +16,11 @@ export interface EventSource {
16
16
  handler: Handler<Ev>
17
17
  ) => void
18
18
 
19
- readonly setup: (rendered: Rendered, scope: Scope.Scope) => Effect.Effect<never, never, void>
19
+ readonly setup: (rendered: Rendered, scope: Scope.Scope) => Effect.Effect<void>
20
20
  }
21
21
 
22
22
  type Entry = readonly [Element, Handler<any>]
23
- type Run = <E, A>(effect: Effect.Effect<never, E, A>) => Fiber.RuntimeFiber<E, A>
23
+ type Run = <E, A>(effect: Effect.Effect<A, E>) => Fiber.RuntimeFiber<A, E>
24
24
 
25
25
  const disposable = (f: () => void): Disposable => ({
26
26
  [Symbol.dispose]: f
@@ -130,7 +130,7 @@ export function makeEventSource(): EventSource {
130
130
  const disposables: Array<Disposable> = []
131
131
  const fibers = new Map<symbol, Fiber.RuntimeFiber<any, any>>()
132
132
  const runFork = Runtime.runFork(runtime)
133
- const run: Run = <E, A>(effect: Effect.Effect<never, E, A>) => {
133
+ const run: Run = <E, A>(effect: Effect.Effect<A, E>) => {
134
134
  const id = Symbol()
135
135
  const fiber = runFork(Effect.onExit(effect, () => Effect.sync(() => fibers.delete(id))))
136
136
  fibers.set(id, fiber)
@@ -40,11 +40,7 @@ export const hydrateTemplate: (document: Document, ctx: RenderContext) => Render
40
40
  return <Values extends ReadonlyArray<Renderable<any, any>>>(
41
41
  templateStrings: TemplateStringsArray,
42
42
  values: Values
43
- ): Fx.Fx<
44
- Scope.Scope | Placeholder.Context<Values[number]>,
45
- Placeholder.Error<Values[number]>,
46
- RenderEvent
47
- > => {
43
+ ): Fx.Fx<RenderEvent, Placeholder.Error<Values[number]>, Scope.Scope | Placeholder.Context<Values[number]>> => {
48
44
  return Fx.make((sink) =>
49
45
  Effect.gen(function*(_) {
50
46
  const context = yield* _(Effect.context<Scope.Scope>())
@@ -95,13 +91,13 @@ export const hydrateTemplate: (document: Document, ctx: RenderContext) => Render
95
91
  }
96
92
 
97
93
  // Connect our interpolated values to our template parts
98
- const effects: Array<Effect.Effect<Scope.Scope | Placeholder.Context<Values[number]>, never, void>> = []
94
+ const effects: Array<Effect.Effect<void, never, Scope.Scope | Placeholder.Context<Values[number]>>> = []
99
95
  for (const [part, path] of template.parts) {
100
96
  const eff = renderPart2(part, where, path, ctx)
101
97
  if (eff !== null) {
102
98
  effects.push(
103
99
  ...(Array.isArray(eff) ? eff : [eff]) as Array<
104
- Effect.Effect<Scope.Scope | Placeholder.Context<Values[number]>, never, void>
100
+ Effect.Effect<void, never, Scope.Scope | Placeholder.Context<Values[number]>>
105
101
  >
106
102
  )
107
103
  }
@@ -3,19 +3,15 @@ import * as Effect from "effect/Effect"
3
3
  import * as Option from "effect/Option"
4
4
 
5
5
  export type IndexRefCounter = {
6
- release: (index: number) => Effect.Effect<never, never, void>
7
- wait: Effect.Effect<never, never, void>
6
+ release: (index: number) => Effect.Effect<void>
7
+ wait: Effect.Effect<void>
8
8
  }
9
9
 
10
10
  /**
11
11
  * @internal
12
12
  */
13
- export function indexRefCounter(expected: number): Effect.Effect<
14
- never,
15
- never,
16
- IndexRefCounter
17
- > {
18
- return Effect.map(Deferred.make<never, void>(), (deferred) => {
13
+ export function indexRefCounter(expected: number): Effect.Effect<IndexRefCounter> {
14
+ return Effect.map(Deferred.make<void>(), (deferred) => {
19
15
  const done = Deferred.succeed(deferred, undefined)
20
16
  const indexes = new Set<number>(Array.from({ length: expected }, (_, i) => i))
21
17
 
@@ -37,20 +33,16 @@ export function indexRefCounter(expected: number): Effect.Effect<
37
33
  }
38
34
 
39
35
  export type IndexRefCounter2 = {
40
- release: (index: number) => Effect.Effect<never, never, void>
41
- expect: (count: number) => Effect.Effect<never, never, boolean>
42
- wait: Effect.Effect<never, never, void>
36
+ release: (index: number) => Effect.Effect<void>
37
+ expect: (count: number) => Effect.Effect<boolean>
38
+ wait: Effect.Effect<void>
43
39
  }
44
40
 
45
41
  /**
46
42
  * @internal
47
43
  */
48
- export function indexRefCounter2(): Effect.Effect<
49
- never,
50
- never,
51
- IndexRefCounter2
52
- > {
53
- return Effect.map(Deferred.make<never, void>(), (deferred) => {
44
+ export function indexRefCounter2(): Effect.Effect<IndexRefCounter2> {
45
+ return Effect.map(Deferred.make<void>(), (deferred) => {
54
46
  let expected: Option.Option<number> = Option.none<number>()
55
47
  const done = Deferred.succeed(deferred, undefined)
56
48
  const indexes = new Set<number>()
@@ -1,44 +1,44 @@
1
1
  import type { Placeholder } from "../Placeholder.js"
2
2
 
3
3
  declare global {
4
- export interface String extends Placeholder<never, never, string> {}
4
+ export interface String extends Placeholder<string> {}
5
5
 
6
- export interface Number extends Placeholder<never, never, number> {}
6
+ export interface Number extends Placeholder<number> {}
7
7
 
8
- export interface Boolean extends Placeholder<never, never, boolean> {}
8
+ export interface Boolean extends Placeholder<boolean> {}
9
9
 
10
- export interface Symbol extends Placeholder<never, never, symbol> {}
10
+ export interface Symbol extends Placeholder<symbol> {}
11
11
 
12
- export interface BigInt extends Placeholder<never, never, bigint> {}
12
+ export interface BigInt extends Placeholder<bigint> {}
13
13
 
14
14
  export interface Array<T> extends
15
15
  Placeholder<
16
- Placeholder.Context<T>,
16
+ Array<Placeholder.Success<T>>,
17
17
  Placeholder.Error<T>,
18
- Array<Placeholder.Success<T>>
18
+ Placeholder.Context<T>
19
19
  >
20
20
  {}
21
21
 
22
22
  export interface ReadonlyArray<T> extends
23
23
  Placeholder<
24
- Placeholder.Context<T>,
24
+ ReadonlyArray<Placeholder.Success<T>>,
25
25
  Placeholder.Error<T>,
26
- ReadonlyArray<Placeholder.Success<T>>
26
+ Placeholder.Context<T>
27
27
  >
28
28
  {}
29
29
 
30
30
  // DOM types
31
- export interface Node extends Placeholder<never, never, Node> {}
31
+ export interface Node extends Placeholder<Node> {}
32
32
 
33
- export interface DocumentFragment extends Placeholder<never, never, DocumentFragment> {}
33
+ export interface DocumentFragment extends Placeholder<DocumentFragment> {}
34
34
 
35
- export interface Element extends Placeholder<never, never, Element> {}
35
+ export interface Element extends Placeholder<Element> {}
36
36
 
37
- export interface HTMLElement extends Placeholder<never, never, HTMLElement> {}
37
+ export interface HTMLElement extends Placeholder<HTMLElement> {}
38
38
 
39
- export interface SVGElement extends Placeholder<never, never, SVGElement> {}
39
+ export interface SVGElement extends Placeholder<SVGElement> {}
40
40
  }
41
41
 
42
42
  declare module "@typed/fx/Fx" {
43
- export interface Fx<R, E, A> extends Placeholder<R, E, A> {}
43
+ export interface Fx<A, E, R> extends Placeholder<A, E, R> {}
44
44
  }
@@ -33,47 +33,46 @@ import { findHoleComment } from "./utils.js"
33
33
 
34
34
  const strictEq = Equivalence.strict<any>()
35
35
 
36
- const base = <T extends Part["_tag"]>(tag: T) =>
37
- class Base {
38
- readonly _tag: T = tag
39
-
40
- constructor(
41
- readonly index: number,
42
- readonly commit: (
43
- params: {
44
- previous: Extract<Part, { readonly _tag: T }>["value"]
45
- value: Extract<Part, { readonly _tag: T }>["value"]
46
- part: Extract<Part, { readonly _tag: T }>
47
- }
48
- ) => Effect.Effect<Scope, never, void>,
49
- public value: Extract<Part, { readonly _tag: T }>["value"],
50
- readonly eq: Equivalence.Equivalence<Extract<Part, { readonly _tag: T }>["value"]> = equals
51
- ) {
52
- this.update = this.update.bind(this)
53
- }
54
-
55
- update(input: this["value"]) {
56
- const previous = this.value as any
57
- const value = this.getValue(input) as any
36
+ const base = <T extends Part["_tag"]>(tag: T) => (class Base {
37
+ readonly _tag: T = tag
58
38
 
59
- if (this.eq(previous as any, value as any)) {
60
- return Effect.unit
39
+ constructor(
40
+ readonly index: number,
41
+ readonly commit: (
42
+ params: {
43
+ previous: Extract<Part, { readonly _tag: T }>["value"]
44
+ value: Extract<Part, { readonly _tag: T }>["value"]
45
+ part: Extract<Part, { readonly _tag: T }>
61
46
  }
47
+ ) => Effect.Effect<void, never, Scope>,
48
+ public value: Extract<Part, { readonly _tag: T }>["value"],
49
+ readonly eq: Equivalence.Equivalence<Extract<Part, { readonly _tag: T }>["value"]> = equals
50
+ ) {
51
+ this.update = this.update.bind(this)
52
+ }
62
53
 
63
- return Effect.flatMap(
64
- this.commit.call(this, {
65
- previous,
66
- value,
67
- part: this as any
68
- }),
69
- () => Effect.sync(() => this.value = value)
70
- )
71
- }
54
+ update(input: this["value"]) {
55
+ const previous = this.value as any
56
+ const value = this.getValue(input) as any
72
57
 
73
- getValue(value: unknown) {
74
- return value
58
+ if (this.eq(previous as any, value as any)) {
59
+ return Effect.unit
75
60
  }
61
+
62
+ return Effect.flatMap(
63
+ this.commit.call(this, {
64
+ previous,
65
+ value,
66
+ part: this as any
67
+ }),
68
+ () => Effect.sync(() => this.value = value)
69
+ )
70
+ }
71
+
72
+ getValue(value: unknown) {
73
+ return value
76
74
  }
75
+ })
77
76
 
78
77
  export class AttributePartImpl extends base("attribute") implements AttributePart {
79
78
  constructor(
@@ -295,8 +294,8 @@ export class EventPartImpl implements EventPart {
295
294
  readonly name: string,
296
295
  readonly index: number,
297
296
  readonly source: ElementSource<any>,
298
- readonly onCause: <E>(cause: Cause<E>) => Effect.Effect<never, never, unknown>,
299
- readonly addEventListener: <Ev extends Event>(handler: EventHandler<never, never, Ev>) => void
297
+ readonly onCause: <E>(cause: Cause<E>) => Effect.Effect<unknown>,
298
+ readonly addEventListener: <Ev extends Event>(handler: EventHandler<Ev>) => void
300
299
  ) {
301
300
  }
302
301
  }
@@ -489,35 +488,34 @@ function fromKeyValue(name: string, value: unknown): Array<NameValue> {
489
488
  }
490
489
  }
491
490
 
492
- const sparse = <T extends SparsePart["_tag"]>(tag: T) =>
493
- class Base {
494
- readonly _tag: T = tag
495
-
496
- constructor(
497
- readonly commit: (
498
- params: {
499
- previous: SparseAttributeValues<Extract<SparsePart, { readonly _tag: T }>["parts"]>
500
- value: SparseAttributeValues<Extract<SparsePart, { readonly _tag: T }>["parts"]>
501
- part: Extract<SparsePart, { readonly _tag: T }>
502
- }
503
- ) => Effect.Effect<Scope, never, void>,
504
- public value: SparseAttributeValues<Extract<SparsePart, { readonly _tag: T }>["parts"]>,
505
- readonly eq: Equivalence.Equivalence<SparseAttributeValues<Extract<SparsePart, { readonly _tag: T }>["parts"]>> =
506
- equals
507
- ) {}
508
-
509
- update = (value: this["value"]) => {
510
- if (this.eq(this.value as any, value as any)) {
511
- return Effect.unit
512
- }
491
+ const sparse = <T extends SparsePart["_tag"]>(tag: T) => (class Base {
492
+ readonly _tag: T = tag
513
493
 
514
- return this.commit({
515
- previous: this.value,
516
- value: this.value = value as any,
517
- part: this
518
- } as any)
494
+ constructor(
495
+ readonly commit: (
496
+ params: {
497
+ previous: SparseAttributeValues<Extract<SparsePart, { readonly _tag: T }>["parts"]>
498
+ value: SparseAttributeValues<Extract<SparsePart, { readonly _tag: T }>["parts"]>
499
+ part: Extract<SparsePart, { readonly _tag: T }>
500
+ }
501
+ ) => Effect.Effect<void, never, Scope>,
502
+ public value: SparseAttributeValues<Extract<SparsePart, { readonly _tag: T }>["parts"]>,
503
+ readonly eq: Equivalence.Equivalence<SparseAttributeValues<Extract<SparsePart, { readonly _tag: T }>["parts"]>> =
504
+ equals
505
+ ) {}
506
+
507
+ update = (value: this["value"]) => {
508
+ if (this.eq(this.value as any, value as any)) {
509
+ return Effect.unit
519
510
  }
511
+
512
+ return this.commit({
513
+ previous: this.value,
514
+ value: this.value = value as any,
515
+ part: this
516
+ } as any)
520
517
  }
518
+ })
521
519
 
522
520
  type SparseAttributeValues<T extends ReadonlyArray<AttributePart | ClassNamePart | CommentPart | StaticText>> =
523
521
  ReadonlyArray<