use collector semantics