@@ -415,6 +415,7 @@ impl<'arena, 'env, 'data> Context<'arena, 'env, 'data> {
415415 ( Prim :: FormatArray16 , [ FunApp ( len) , FunApp ( format) ] ) => self . read_array ( reader, span, len, format) ,
416416 ( Prim :: FormatArray32 , [ FunApp ( len) , FunApp ( format) ] ) => self . read_array ( reader, span, len, format) ,
417417 ( Prim :: FormatArray64 , [ FunApp ( len) , FunApp ( format) ] ) => self . read_array ( reader, span, len, format) ,
418+ ( Prim :: FormatArray16Map , [ _, _, FunApp ( map_fn) , FunApp ( array) ] ) => self . array_map ( reader, span, map_fn, array) ,
418419 ( Prim :: FormatRepeatUntilEnd , [ FunApp ( format) ] ) => self . read_repeat_until_end ( reader, format) ,
419420 ( Prim :: FormatRepeatUntilFull , [ FunApp ( len) , FunApp ( format) , FunApp ( replicate) ] ) => self . read_repeat_until_full ( reader, len, replicate, format) ,
420421 ( Prim :: FormatLimit8 , [ FunApp ( limit) , FunApp ( format) ] ) => self . read_limit ( reader, limit, format) ,
@@ -458,6 +459,30 @@ impl<'arena, 'env, 'data> Context<'arena, 'env, 'data> {
458459 Ok ( Spanned :: new ( span, Arc :: new ( Value :: ArrayLit ( elem_exprs) ) ) )
459460 }
460461
462+ fn array_map (
463+ & mut self ,
464+ reader : & mut BufferReader < ' data > ,
465+ span : Span ,
466+ map_fn : & ArcValue < ' arena > ,
467+ array : & ArcValue < ' arena > ,
468+ ) -> Result < ArcValue < ' arena > , ReadError < ' arena > > {
469+ let array = self . elim_env ( ) . force ( array) ;
470+ let array = match array. as_ref ( ) {
471+ Value :: ArrayLit ( ary) => ary,
472+ _ => return Err ( ReadError :: InvalidValue ( array. span ( ) ) ) ,
473+ } ;
474+
475+ let elem_exprs = array
476+ . iter ( )
477+ . map ( |elem| {
478+ let elem_format = self . elim_env ( ) . fun_app ( map_fn. clone ( ) , elem. clone ( ) ) ;
479+ self . read_format ( reader, & elem_format)
480+ } )
481+ . collect :: < Result < _ , _ > > ( ) ?;
482+
483+ Ok ( Spanned :: new ( span, Arc :: new ( Value :: ArrayLit ( elem_exprs) ) ) )
484+ }
485+
461486 fn read_repeat_until_end (
462487 & mut self ,
463488 reader : & mut BufferReader < ' data > ,
0 commit comments