@@ -100,21 +100,21 @@ describe("AsyncMaybe", () => {
100100 } ) ;
101101
102102 it ( "short circuits if Nothing" , async ( ) => {
103- // @ts -expect-error
103+ // @ts -expect-error: testing null case
104104 const m = AsyncMaybe . fromPromise < number [ ] | null > ( Promise . resolve ( null ) ) . filterMap ( ( x ) =>
105105 Maybe . fromNullable ( x * 10 ) ,
106106 ) ;
107107 expect ( await m . value ( ) ) . toBeNull ( ) ;
108108
109- // @ts -expect-error
109+ // @ts -expect-error: testing undefined case
110110 const m2 = AsyncMaybe . fromPromise < number [ ] | undefined > ( Promise . resolve ( undefined ) ) . filterMap (
111111 ( x ) => Maybe . fromNullable ( x * 10 ) ,
112112 ) ;
113113 expect ( await m2 . value ( ) ) . toBeUndefined ( ) ;
114114 } ) ;
115115
116116 it ( "returns null if the value is not an array" , async ( ) => {
117- // @ts -expect-error
117+ // @ts -expect-error: testing non-array case
118118 const m = AsyncMaybe . fromPromise ( Promise . resolve ( 123 ) ) . filterMap ( ( x ) =>
119119 Maybe . fromNullable ( x ) ,
120120 ) ;
@@ -132,15 +132,15 @@ describe("AsyncMaybe", () => {
132132
133133 it ( "short circuits if the value is not an object" , async ( ) => {
134134 const m = AsyncMaybe . fromPromise ( Promise . resolve ( 5 ) ) . extend ( "greet" , ( o ) =>
135- // @ts -expect-error
135+ // @ts -expect-error: testing non-object case
136136 AsyncMaybe . fromNullable ( `Hello ${ o . num } ` ) ,
137137 ) ;
138138 expect ( await m . value ( ) ) . toBeNull ( ) ;
139139 } ) ;
140140
141141 it ( "does not confuse null for an object" , async ( ) => {
142142 const m = AsyncMaybe . fromPromise ( Promise . resolve ( null ) ) . extend ( "greet" , ( o ) =>
143- // @ts -expect-error
143+ // @ts -expect-error: testing null case
144144 AsyncMaybe . fromNullable ( `Hello ${ o . num } ` ) ,
145145 ) ;
146146 expect ( await m . value ( ) ) . toBeNull ( ) ;
@@ -155,7 +155,7 @@ describe("AsyncMaybe", () => {
155155
156156 it ( "short circuits if the function returns Nothing" , async ( ) => {
157157 const m = AsyncMaybe . fromPromise ( Promise . resolve ( { num : 2 } ) )
158- . extend ( "greet" , ( o ) => AsyncMaybe . fromNullable < string > ( null ) )
158+ . extend ( "greet" , ( ) => AsyncMaybe . fromNullable < string > ( null ) )
159159 . map ( ( obj ) => `${ obj . greet } stranger!` ) ;
160160 expect ( await m . value ( ) ) . toBeNull ( ) ;
161161 } ) ;
@@ -260,6 +260,43 @@ describe("AsyncMaybe", () => {
260260 } ) ;
261261 } ) ;
262262
263+ describe ( "first" , ( ) => {
264+ it ( "returns the first Just value from an array" , async ( ) => {
265+ const m = AsyncMaybe . fromNullable ( 1 ) ;
266+ const first = m . first ( ( value ) => [
267+ AsyncMaybe . fromNullable ( null ) ,
268+ AsyncMaybe . fromNullable ( 2 ) ,
269+ AsyncMaybe . fromNullable ( value + 10 ) ,
270+ ] ) ;
271+ expect ( await first . value ( ) ) . toBe ( 2 ) ;
272+ } ) ;
273+
274+ it ( "returns Nothing if all are Nothing" , async ( ) => {
275+ const m = AsyncMaybe . fromNullable ( 1 ) ;
276+ const first = m . first ( ( ) => [
277+ AsyncMaybe . fromNullable < number | null > ( null ) ,
278+ AsyncMaybe . fromNullable < number | undefined > ( undefined ) ,
279+ ] ) ;
280+ expect ( await first . value ( ) ) . toBeNull ( ) ;
281+ } ) ;
282+
283+ it ( "short circuits if the original is Nothing" , async ( ) => {
284+ const m = AsyncMaybe . fromNullable < number > ( null ) ;
285+ const first = m . first ( ( ) => [ AsyncMaybe . fromNullable ( 2 ) , AsyncMaybe . fromNullable ( 3 ) ] ) ;
286+ expect ( await first . value ( ) ) . toBeNull ( ) ;
287+ } ) ;
288+
289+ it ( "handles both AsyncMaybe and Maybe values" , async ( ) => {
290+ const m = AsyncMaybe . fromNullable ( 5 ) ;
291+ const first = m . first ( ( value ) => [
292+ Maybe . fromNullable < number > ( null ) ,
293+ AsyncMaybe . fromPromise ( Promise . resolve ( value * 2 ) ) ,
294+ Maybe . fromNullable ( value + 3 ) ,
295+ ] ) ;
296+ expect ( await first . value ( ) ) . toBe ( 10 ) ;
297+ } ) ;
298+ } ) ;
299+
263300 describe ( "withDefault / getOrElse" , ( ) => {
264301 it ( "withDefault supplies a value if Nothing" , async ( ) => {
265302 const absent = AsyncMaybe . fromPromise < number | null > ( Promise . resolve ( null ) ) . withDefault ( 42 ) ;
0 commit comments