@@ -2,7 +2,7 @@ import { $ } from "bun"
22import { afterEach , describe , expect , test } from "bun:test"
33import fs from "fs/promises"
44import path from "path"
5- import { Deferred , Effect , Fiber , Option } from "effect"
5+ import { Deferred , Effect , Option } from "effect"
66import { tmpdir } from "../fixture/fixture"
77import { watcherConfigLayer , withServices } from "../fixture/instance"
88import { FileWatcher } from "../../src/file/watcher"
@@ -25,6 +25,7 @@ function withWatcher<E>(directory: string, body: Effect.Effect<void, E>) {
2525 directory ,
2626 FileWatcher . layer ,
2727 async ( rt ) => {
28+ await rt . runPromise ( FileWatcher . Service . use ( ( ) => Effect . void ) )
2829 await Effect . runPromise ( ready ( directory ) )
2930 await Effect . runPromise ( body )
3031 } ,
@@ -54,24 +55,29 @@ function listen(directory: string, check: (evt: WatcherEvent) => boolean, hit: (
5455}
5556
5657function wait ( directory : string , check : ( evt : WatcherEvent ) => boolean ) {
57- return Effect . callback < WatcherEvent > ( ( resume ) => {
58- const cleanup = listen ( directory , check , ( evt ) => {
59- cleanup ( )
60- resume ( Effect . succeed ( evt ) )
58+ return Effect . gen ( function * ( ) {
59+ const deferred = yield * Deferred . make < WatcherEvent > ( )
60+ const cleanup = yield * Effect . sync ( ( ) => {
61+ let off = ( ) => { }
62+ off = listen ( directory , check , ( evt ) => {
63+ off ( )
64+ Deferred . doneUnsafe ( deferred , Effect . succeed ( evt ) )
65+ } )
66+ return off
6167 } )
62- return Effect . sync ( cleanup )
63- } ) . pipe ( Effect . timeout ( "5 seconds" ) )
68+ return { cleanup, deferred }
69+ } )
6470}
6571
6672function nextUpdate < E > ( directory : string , check : ( evt : WatcherEvent ) => boolean , trigger : Effect . Effect < void , E > ) {
6773 return Effect . acquireUseRelease (
68- wait ( directory , check ) . pipe ( Effect . forkChild ( { startImmediately : true } ) ) ,
69- ( fiber ) =>
74+ wait ( directory , check ) ,
75+ ( { deferred } ) =>
7076 Effect . gen ( function * ( ) {
7177 yield * trigger
72- return yield * Fiber . join ( fiber )
78+ return yield * Deferred . await ( deferred ) . pipe ( Effect . timeout ( "5 seconds" ) )
7379 } ) ,
74- Fiber . interrupt ,
80+ ( { cleanup } ) => Effect . sync ( cleanup ) ,
7581 )
7682}
7783
@@ -82,23 +88,15 @@ function noUpdate<E>(
8288 trigger : Effect . Effect < void , E > ,
8389 ms = 500 ,
8490) {
85- return Effect . gen ( function * ( ) {
86- const deferred = yield * Deferred . make < WatcherEvent > ( )
87-
88- yield * Effect . acquireUseRelease (
89- Effect . sync ( ( ) =>
90- listen ( directory , check , ( evt ) => {
91- Effect . runSync ( Deferred . succeed ( deferred , evt ) )
92- } ) ,
93- ) ,
94- ( ) =>
95- Effect . gen ( function * ( ) {
96- yield * trigger
97- expect ( yield * Deferred . await ( deferred ) . pipe ( Effect . timeoutOption ( `${ ms } millis` ) ) ) . toEqual ( Option . none ( ) )
98- } ) ,
99- ( cleanup ) => Effect . sync ( cleanup ) ,
100- )
101- } )
91+ return Effect . acquireUseRelease (
92+ wait ( directory , check ) ,
93+ ( { deferred } ) =>
94+ Effect . gen ( function * ( ) {
95+ yield * trigger
96+ expect ( yield * Deferred . await ( deferred ) . pipe ( Effect . timeoutOption ( `${ ms } millis` ) ) ) . toEqual ( Option . none ( ) )
97+ } ) ,
98+ ( { cleanup } ) => Effect . sync ( cleanup ) ,
99+ )
102100}
103101
104102function ready ( directory : string ) {
0 commit comments