public function byJoining(
            string $delimiter = ', ',
            string $prefix = '',
            string $suffix = '',
            string $keySeparator = null
    ): string {
        return $this->with(
                function () { return null; },
                function(&$joinedElements, $element, $key) use($prefix, $delimiter, $keySeparator)
                {
                    if (null === $joinedElements) {
                        $joinedElements = $prefix;
                    } else {
                        $joinedElements .= $delimiter;
                    }

                    $joinedElements .= (null !== $keySeparator ? $key . $keySeparator : null) . $element;
                },
                function($joinedElements) use($suffix) { return $joinedElements . $suffix; }
        );
    }