@@ -56,6 +56,7 @@ export interface FindInput {
5656 readonly hidden ?: boolean
5757 readonly follow ?: boolean
5858 readonly signal ?: AbortSignal
59+ readonly onEntry ?: ( entry : Entry ) => Effect . Effect < void >
5960}
6061
6162export interface GlobInput {
@@ -102,6 +103,7 @@ export const layer = Layer.effect(
102103 readonly signal ?: AbortSignal
103104 readonly parse : ( line : string ) => Effect . Effect < A | undefined , Error >
104105 readonly pattern ?: string
106+ readonly onItem ?: ( item : A ) => Effect . Effect < void >
105107 } ) => {
106108 const program = Effect . scoped (
107109 Effect . gen ( function * ( ) {
@@ -112,11 +114,16 @@ export const layer = Layer.effect(
112114 Effect . map ( ( output ) => output . buffer . toString ( "utf8" ) ) ,
113115 Effect . forkScoped ,
114116 )
117+ let observed = 0
115118 const rows = yield * Stream . decodeText ( handle . stdout ) . pipe (
116119 Stream . splitLines ,
117120 Stream . filter ( ( line ) => line . length > 0 ) ,
118121 Stream . mapEffect ( input . parse ) ,
119122 Stream . filter ( ( row ) : row is A => row !== undefined ) ,
123+ Stream . tap ( ( row ) => {
124+ if ( ! input . onItem || observed ++ >= input . limit ) return Effect . void
125+ return input . onItem ( row )
126+ } ) ,
120127 Stream . take ( input . limit + 1 ) ,
121128 Stream . runCollect ,
122129 Effect . map ( ( chunk ) => [ ...chunk ] ) ,
@@ -181,7 +188,7 @@ export const layer = Layer.effect(
181188 Effect . catchTag ( "Ripgrep.InvalidPatternError" , ( cause ) => Effect . fail ( failure ( cause . message , cause ) ) ) ,
182189 ) ,
183190 find : ( input ) =>
184- run < string > ( {
191+ run < Entry > ( {
185192 cwd : input . cwd ,
186193 limit : input . limit ,
187194 signal : input . signal ,
@@ -194,24 +201,22 @@ export const layer = Layer.effect(
194201 `--glob=${ input . pattern } ` ,
195202 "." ,
196203 ] ,
197- parse : ( line ) =>
198- Effect . succeed (
199- line
200- . replace ( / ^ (?: \. [ \\ / ] ) + / u, "" )
201- . replace ( / ^ [ \\ / ] + / u, "" )
202- . replaceAll ( "\\" , "/" ) ,
203- ) ,
204- } ) . pipe (
205- Effect . map ( ( result ) =>
206- result . items . map ( ( relative ) => {
207- const absolute = path . resolve ( input . cwd , relative )
208- return new Entry ( {
204+ parse : ( line ) => {
205+ const relative = line
206+ . replace ( / ^ (?: \. [ \\ / ] ) + / u, "" )
207+ . replace ( / ^ [ \\ / ] + / u, "" )
208+ . replaceAll ( "\\" , "/" )
209+ return Effect . succeed (
210+ new Entry ( {
209211 path : RelativePath . make ( relative ) ,
210212 type : "file" ,
211- mime : FSUtil . mimeType ( absolute ) ,
212- } )
213- } ) ,
214- ) ,
213+ mime : FSUtil . mimeType ( path . resolve ( input . cwd , relative ) ) ,
214+ } ) ,
215+ )
216+ } ,
217+ onItem : input . onEntry ,
218+ } ) . pipe (
219+ Effect . map ( ( result ) => result . items ) ,
215220 Effect . catchTag ( "Ripgrep.InvalidPatternError" , ( cause ) => Effect . fail ( failure ( cause . message , cause ) ) ) ,
216221 ) ,
217222 grep : ( input ) =>
0 commit comments