public function map($expression)
    {
        $new = new self;

        $this->walk(function ($v, $k) use ($expression, $new) {
            $new[$k] = $this->call($expression, $v, $k);
        });

        return $new;
    }
public function map($expression)
    {
        $new = new self;

        $this->walk(function ($v, $k) use ($expression, $new) {
            $new[$k] = $this->call($expression, $v, $k);
        });

        return $new;
    }
public function map ( $ expression ) { $ new = new self ; $ this -> walk ( function ( $ v , $ k ) use ( $ expression , $ new ) { $ new [ $ k ] = $ this -> call ( $ expression , $ v , $ k ) ; } ) ; return $ new ; }
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
Walk the map applying the expression to every element transforming them into a new map .