/** * Buckets for each potential offer, keeping duplicate offers. * * @throws \InvalidArgumentException * * @return Collection|PotentialOffer[] */ private function potentials() : Collection { return $this->components->map(function (OfferComponent $component) { return $component->product(); })->filter(function (Product $product) { return $product->offers->count(); })->reduce(function (Collection $potentials, Product $product) { return $potentials->push(new PotentialOffer($product->offers->first())); }, new Collection()); }
/** * @return string */ public function listComponents() : string { $identifiers = $this->components->map(function (OfferComponent $component) { return $component->product()->sku; }); if ($identifiers->count() > 1) { return sprintf('%s and %s', $identifiers->slice(0, -1)->implode(', '), $identifiers->last()); } return $identifiers->pop(); }