non-destructive reduce