@@ -17,12 +17,14 @@ import type {
1717  Document , 
1818  DropCollectionOptions , 
1919  DropIndexesOptions , 
20+   FindOneAndReplaceOptions , 
2021  FindOptions  as  MongoFindOptions , 
2122  IndexDescription , 
2223  IndexSpecification , 
2324  InsertManyResult , 
2425  InsertOneOptions , 
2526  InsertOneResult , 
27+   ModifyResult  as  MongoModifyResult , 
2628  RenameOptions , 
2729  ReplaceOptions , 
2830  UpdateFilter , 
@@ -32,6 +34,8 @@ import type {
3234import  *  as  AggregationCursor  from  "./AggregationCursor.js" 
3335import  *  as  FindCursor  from  "./FindCursor.js" 
3436import  type  {  Filter  }  from  "./internal/filter.js" 
37+ import  type  {  ModifyResult  }  from  "./internal/modify-result.js" 
38+ import  *  as  SchemaExt  from  "./internal/schema.js" 
3539import  *  as  MongoError  from  "./MongoError.js" 
3640
3741export  class  Collection < A  extends  Document ,  I  extends  Document  =  A ,  R  =  never >  extends  Data . TaggedClass ( "Collection" ) < { 
@@ -256,6 +260,87 @@ export const replaceOne: {
256260    ) 
257261) 
258262
263+ export  const  findOneAndReplace : { 
264+   < A  extends  Document ,  I  extends  Document > ( 
265+     filter : Filter < I > , 
266+     replacement : A , 
267+     options : FindOneAndReplaceOptions  &  {  includeResultMetadata : true  } 
268+   ) : < R > ( 
269+     collection : Collection < A ,  I ,  R > 
270+   )  =>  Effect . Effect < ModifyResult < A > ,  MongoError . MongoError  |  ParseResult . ParseError ,  R > 
271+   < A  extends  Document ,  I  extends  Document > ( 
272+     filter : Filter < I > , 
273+     replacement : A , 
274+     options : FindOneAndReplaceOptions  &  {  includeResultMetadata : false  } 
275+   ) : < R > ( 
276+     collection : Collection < A ,  I ,  R > 
277+   )  =>  Effect . Effect < O . Option < A > ,  MongoError . MongoError  |  ParseResult . ParseError ,  R > 
278+   < A  extends  Document ,  I  extends  Document > ( 
279+     filter : Filter < I > , 
280+     replacement : A , 
281+     options : FindOneAndReplaceOptions 
282+   ) : < R > ( 
283+     collection : Collection < A ,  I ,  R > 
284+   )  =>  Effect . Effect < O . Option < A > ,  MongoError . MongoError  |  ParseResult . ParseError ,  R > 
285+   < A  extends  Document ,  I  extends  Document > ( 
286+     filter : Filter < I > , 
287+     replacement : A 
288+   ) : < R > ( 
289+     collection : Collection < A ,  I ,  R > 
290+   )  =>  Effect . Effect < O . Option < A > ,  MongoError . MongoError  |  ParseResult . ParseError ,  R > 
291+   < A  extends  Document ,  I  extends  Document ,  R > ( 
292+     collection : Collection < A ,  I ,  R > , 
293+     filter : Filter < I > , 
294+     replacement : A , 
295+     options : FindOneAndReplaceOptions  &  {  includeResultMetadata : true  } 
296+   ) : Effect . Effect < ModifyResult < A > ,  MongoError . MongoError  |  ParseResult . ParseError ,  R > 
297+   < A  extends  Document ,  I  extends  Document ,  R > ( 
298+     collection : Collection < A ,  I ,  R > , 
299+     filter : Filter < I > , 
300+     replacement : A , 
301+     options : FindOneAndReplaceOptions  &  {  includeResultMetadata : false  } 
302+   ) : Effect . Effect < O . Option < A > ,  MongoError . MongoError  |  ParseResult . ParseError ,  R > 
303+   < A  extends  Document ,  I  extends  Document ,  R > ( 
304+     collection : Collection < A ,  I ,  R > , 
305+     filter : Filter < I > , 
306+     replacement : A , 
307+     options : FindOneAndReplaceOptions 
308+   ) : Effect . Effect < O . Option < A > ,  MongoError . MongoError  |  ParseResult . ParseError ,  R > 
309+   < A  extends  Document ,  I  extends  Document ,  R > ( 
310+     collection : Collection < A ,  I ,  R > , 
311+     filter : Filter < I > , 
312+     replacement : A 
313+   ) : Effect . Effect < O . Option < A > ,  MongoError . MongoError  |  ParseResult . ParseError ,  R > 
314+ }  =  F . dual ( 
315+   ( args )  =>  isCollection ( args [ 0 ] ) , 
316+   < A  extends  Document ,  I  extends  Document ,  R > ( 
317+     collection : Collection < A ,  I ,  R > , 
318+     filter : Filter < I > , 
319+     replacement : A , 
320+     options ?: FindOneAndReplaceOptions 
321+   ) : Effect . Effect < O . Option < A >  |  ModifyResult < A > ,  MongoError . MongoError  |  ParseResult . ParseError ,  R >  => 
322+     F . pipe ( 
323+       // TODO: extract function in Collection 
324+       Schema . encode ( collection . schema ) ( replacement ) , 
325+       Effect . flatMap ( ( replacement )  => 
326+         Effect . promise ( ( )  =>  collection . collection . findOneAndReplace ( filter ,  replacement ,  options  ??  { } ) ) 
327+       ) , 
328+       Effect . flatMap ( ( value )  => 
329+         Effect . gen ( function * ( _ )  { 
330+           if  ( options ?. includeResultMetadata  &&  ! ! value )  { 
331+             const  result  =  value  as  unknown  as  MongoModifyResult < I > 
332+             const  maybeValue  =  yield *  _ ( SchemaExt . decodeNullableDocument ( collection . schema ,  result . value ) ) 
333+             return  {  ...result ,  value : maybeValue  } 
334+           } 
335+           return  yield *  _ ( SchemaExt . decodeNullableDocument ( collection . schema ,  value ) ) 
336+         } ) 
337+       ) , 
338+       Effect . catchAllDefect ( 
339+         MongoError . mongoErrorDie < O . Option < A >  |  ModifyResult < A > > ( "findOneAndReplace error" ) 
340+       ) 
341+     ) 
342+ ) 
343+ 
259344export  const  rename : { 
260345  ( 
261346    newName : string , 
0 commit comments