public function push(Identity $identity, object $entity, State $wished): self
    {
        if (!$this->states->contains($wished)) {
            throw new DomainException;
        }

        $this->states = $this->states->map(static function(
            State $state,
            MapInterface $entities
        ) use (
            $identity,
            $entity,
            $wished
        ) {
            if ($wished === $state) {
                return $entities->put($identity, $entity);
            }

            return $entities->remove($identity);
        });

        return $this;
    }