public function kIntersect(Collection $other, \Closure $function = null)
    {
        return new static(
            Match::on(Option::create($function))
                ->Monad_Option_Some(function () use ($other, $function) {
                    return \array_intersect_ukey($this->getArrayCopy(), $other->getArrayCopy(), $function);
                })
                ->Monad_Option_None(function () use ($other) {
                    return \array_intersect_key($this->getArrayCopy(), $other->getArrayCopy());
                })
                ->value(),
            $this->type
        );
    }