function difference(Set $that) {
        $difference = $this->cloneEmpty();

        if ($that === $this) {
            return $difference;
        }

        $this->addIf($difference, $this, negate([$that, 'has']));
        $this->addIf($difference, $that, negate([$this, 'has']));

        return $difference;
    }