addresses = $addresses; } /** * Parse an address (list) like "a@b.c" or "a@b.c, d@e.f" * * @param string|string[] $str address list string to parse * @return AddressList */ public static function parse($str) { $hordeList = new Horde_Mail_Rfc822_List($str); return self::fromHorde($hordeList); } /** * Construct a new list from an horde list * * @param Horde_Mail_Rfc822_List $hordeList * @return AddressList */ public static function fromHorde(Horde_Mail_Rfc822_List $hordeList) { $addresses = array_map(static fn (Horde_Mail_Rfc822_Address $addr) => Address::fromHorde($addr), array_filter(iterator_to_array($hordeList), static fn (Horde_Mail_Rfc822_Object $obj) // TODO: how to handle non-addresses? This doesn't seem right … => $obj instanceof Horde_Mail_Rfc822_Address)); return new AddressList($addresses); } public static function fromRow(array $recipient): self { return new self([ Address::fromRaw($recipient['label'], $recipient['email']) ]); } /** * Get first element * * Returns null if the list is empty * * @return Address|null */ public function first() { if ($this->addresses === []) { return null; } return $this->addresses[0]; } #[\Override] #[ReturnTypeWillChange] public function jsonSerialize() { return array_map(static fn (Address $address) => $address->jsonSerialize(), $this->addresses); } /** * @return int */ #[\Override] #[ReturnTypeWillChange] public function count() { return count($this->addresses); } /** * Iterate over the internal list of addresses using a generator method * * @return \Generator * * @psalm-return \Generator */ public function iterate(): \Generator { foreach ($this->addresses as $address) { yield $address; } } /** * @param AddressList $other * @return AddressList */ public function merge(AddressList $other) { $addresses = $this->addresses; foreach ($other->addresses as $address) { $same = array_filter($addresses, static fn (Address $our) // Check whether our array contains the other address => $our->equals($address)); if ($same === []) { // No dup found, hence the address is new and we // have to add it $addresses[] = $address; } } return new AddressList($addresses); } public function toHorde(): Horde_Mail_Rfc822_List { $hordeAddresses = array_map(static fn (Address $address) => $address->toHorde(), $this->addresses); return new Horde_Mail_Rfc822_List($hordeAddresses); } }