|
1 | 1 | import { BusEvent } from "@/bus/bus-event" |
2 | 2 | import { InstanceState } from "@/effect/instance-state" |
| 3 | +import { makeRuntime } from "@/effect/run-service" |
3 | 4 | import { AppFileSystem } from "@/filesystem" |
4 | 5 | import { Git } from "@/git" |
5 | 6 | import { Effect, Layer, Context } from "effect" |
| 7 | +import * as Stream from "effect/Stream" |
6 | 8 | import { formatPatch, structuredPatch } from "diff" |
7 | 9 | import fuzzysort from "fuzzysort" |
8 | 10 | import ignore from "ignore" |
@@ -342,6 +344,7 @@ export namespace File { |
342 | 344 | Service, |
343 | 345 | Effect.gen(function* () { |
344 | 346 | const appFs = yield* AppFileSystem.Service |
| 347 | + const rg = yield* Ripgrep.Service |
345 | 348 | const git = yield* Git.Service |
346 | 349 |
|
347 | 350 | const state = yield* InstanceState.make<State>( |
@@ -381,7 +384,10 @@ export namespace File { |
381 | 384 |
|
382 | 385 | next.dirs = Array.from(dirs).toSorted() |
383 | 386 | } else { |
384 | | - const files = yield* Effect.promise(() => Array.fromAsync(Ripgrep.files({ cwd: Instance.directory }))) |
| 387 | + const files = yield* rg.files({ cwd: Instance.directory }).pipe( |
| 388 | + Stream.runCollect, |
| 389 | + Effect.map((chunk) => [...chunk]), |
| 390 | + ) |
385 | 391 | const seen = new Set<string>() |
386 | 392 | for (const file of files) { |
387 | 393 | next.files.push(file) |
@@ -642,5 +648,31 @@ export namespace File { |
642 | 648 | }), |
643 | 649 | ) |
644 | 650 |
|
645 | | - export const defaultLayer = layer.pipe(Layer.provide(AppFileSystem.defaultLayer), Layer.provide(Git.defaultLayer)) |
| 651 | + export const defaultLayer = layer.pipe( |
| 652 | + Layer.provide(Ripgrep.defaultLayer), |
| 653 | + Layer.provide(AppFileSystem.defaultLayer), |
| 654 | + Layer.provide(Git.defaultLayer), |
| 655 | + ) |
| 656 | + |
| 657 | + const { runPromise } = makeRuntime(Service, defaultLayer) |
| 658 | + |
| 659 | + export function init() { |
| 660 | + return runPromise((svc) => svc.init()) |
| 661 | + } |
| 662 | + |
| 663 | + export async function status() { |
| 664 | + return runPromise((svc) => svc.status()) |
| 665 | + } |
| 666 | + |
| 667 | + export async function read(file: string): Promise<Content> { |
| 668 | + return runPromise((svc) => svc.read(file)) |
| 669 | + } |
| 670 | + |
| 671 | + export async function list(dir?: string) { |
| 672 | + return runPromise((svc) => svc.list(dir)) |
| 673 | + } |
| 674 | + |
| 675 | + export async function search(input: { query: string; limit?: number; dirs?: boolean; type?: "file" | "directory" }) { |
| 676 | + return runPromise((svc) => svc.search(input)) |
| 677 | + } |
646 | 678 | } |
0 commit comments