original_string: public function map($expression)
      {
          $new = new self;
  
          $this->walk(function ($v, $k) use ($expression, $new) {
              $new[$k] = $this->call($expression, $v, $k);
          });
  
          return $new;
      }
code: public function map($expression)
      {
          $new = new self;
  
          $this->walk(function ($v, $k) use ($expression, $new) {
              $new[$k] = $this->call($expression, $v, $k);
          });
  
          return $new;
      }
code_tokens: public function map ( $ expression ) { $ new = new self ; $ this -> walk ( function ( $ v , $ k ) use ( $ expression , $ new ) { $ new [ $ k ] = $ this -> call ( $ expression , $ v , $ k ) ; } ) ; return $ new ; }
docstring: Walk the map, applying the expression to every element, transforming
  them into a new map.
  
  ```
  $nums = new Map(range(0, 9));
  $doubled = $nums->map('$_0 * 2');
  ```
  
  The expression receives two arguments:
  - The current value in `$_0`
  - The current key in `$_1`
  
  The keys in the resulting map will be the same as the keys in the
  original map: only the values have (potentially) changed.
  
  Recommended to use this method when you are mapping from one type to
  the same type: int to int, string to string, etc. If you are changing
  types, use the more powerful `transform` method.
  
  @param callable|string $expression
  @return Map
  @api
docstring_tokens: Walk the map applying the expression to every element transforming them into a new map .