cleanup, use yield*