public function zipLeft($other)
    {
        if (count($other) !== count($this)) {
            throw new \InvalidArgumentException(
                'Both left and right must have same size.'
            );
        }

        if (is_array($other)) {
            $aKeys = array_keys($this->data);
            $other = new Dict($other);

            return new Dict(
                array_map(
                    function ($key) use ($other) {
                        $leftValue = $this->getOrElse($key);
                        $rightValue = $other->getOrElse($key);

                        return new Tuple([$rightValue, $leftValue]);
                    },
                    $aKeys
                )
            );
        }

        if ($other instanceof Dict) {
            return $other->zipLeft($this->data);
        }

        throw new \InvalidArgumentException('`$other` must be `Dict` or `array`');
    }