Skip to content

Commit c42336f

Browse files
committed
feat: add provider: { effect, succeed } to Resources
1 parent e00bf12 commit c42336f

File tree

4 files changed

+27
-16
lines changed

4 files changed

+27
-16
lines changed

alchemy-effect-aws/src/sqs/queue.provider.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
import * as Effect from "effect/Effect";
2-
import * as Layer from "effect/Layer";
32
import * as Schedule from "effect/Schedule";
43

5-
import { App, Provider, type ProviderService } from "@alchemy.run/effect";
4+
import { App, type ProviderService } from "@alchemy.run/effect";
65
import { AccountID } from "../account.ts";
76
import { Region } from "../region.ts";
87
import { QueueClient } from "./queue.client.ts";
98
import { Queue, type QueueProps } from "./queue.ts";
109

1110
export const queueProvider = () =>
12-
Layer.effect(
13-
Provider(Queue),
11+
Queue.provider.effect(
1412
Effect.gen(function* () {
1513
const sqs = yield* QueueClient;
1614
const app = yield* App;

alchemy-effect-cloudflare/src/kv.provider.ts

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
1-
import { App, Provider } from "@alchemy.run/effect";
1+
import { App } from "@alchemy.run/effect";
22
import * as Effect from "effect/Effect";
3-
import * as Layer from "effect/Layer";
43
import { CloudflareAccountId, CloudflareApi } from "./api.ts";
5-
import { KV, type KVProps } from "./kv.ts";
4+
import { KV as KVNamespace, type KVProps } from "./kv.ts";
65

76
export const kvProvider = () =>
8-
Layer.effect(
9-
Provider(KV),
7+
KVNamespace.provider.effect(
108
Effect.gen(function* () {
119
const app = yield* App;
1210
const api = yield* CloudflareApi;
@@ -15,7 +13,7 @@ export const kvProvider = () =>
1513
const createTitle = (id: string, news: KVProps) =>
1614
news.title ?? `${app.name}-${id}-${app.stage}`;
1715

18-
return Provider(KV).of({
16+
return {
1917
create: Effect.fn(function* ({ id, news }) {
2018
const result = yield* Effect.promise(() =>
2119
api.kv.namespaces.create({
@@ -48,6 +46,6 @@ export const kvProvider = () =>
4846
}),
4947
);
5048
}),
51-
});
49+
};
5250
}),
5351
);

alchemy-effect-cloudflare/src/kv.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,12 @@ export type KVAttr<Props extends KVProps> = {
99
namespaceId: string;
1010
};
1111

12-
export interface KV extends Resource<"Cloudflare.KV"> {
13-
props: KVProps;
14-
attr: KVAttr<this["props"]>;
15-
}
12+
export interface KV<ID extends string, Props extends KVProps>
13+
extends Resource<"Cloudflare.KVNamespace", ID, Props, KVAttr<Props>> {}
1614

17-
export const KV = Resource<KV>("Cloudflare.KV");
15+
export const KV = Resource<{
16+
<const ID extends string, const Props extends KVProps>(
17+
id: ID,
18+
props: Props,
19+
): KV<ID, Props>;
20+
}>("Cloudflare.KVNamespace");

alchemy-effect/src/resource.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
import type { Effect } from "effect/Effect";
2+
import type { Layer } from "effect/Layer";
3+
import type { Provider, ProviderService } from "./provider.ts";
4+
15
export interface IResource<
26
Type extends string = string,
37
ID extends string = string,
@@ -43,4 +47,12 @@ export const Resource = <Ctor extends (id: string, props: any) => Resource>(
4347
new (): ReturnType<Ctor> & {
4448
parent: ReturnType<Ctor>;
4549
};
50+
provider: {
51+
effect<Err, Req>(
52+
eff: Effect<ProviderService<ReturnType<Ctor>>, Err, Req>,
53+
): Layer<Provider<ReturnType<Ctor>>, Err, Req>;
54+
succeed(
55+
service: ProviderService<ReturnType<Ctor>>,
56+
): Layer<Provider<ReturnType<Ctor>>>;
57+
};
4658
};

0 commit comments

Comments
 (0)