title: How to modify this nested case classes with "Seq" fields?
body: <p>Some nested case classes and the field <code>addresses</code> is a <code>Seq[Address]</code>:</p>
  
  <pre><code>// ... means other fields
  case class Street(name: String, ...)
  case class Address(street: Street, ...)
  case class Company(addresses: Seq[Address], ...)
  case class Employee(company: Company, ...)
  </code></pre>
  
  <p>I have an employee:</p>
  
  <pre><code>val employee = Employee(Company(Seq(
      Address(Street("aaa street")),
      Address(Street("bbb street")),
      Address(Street("bpp street")))))
  </code></pre>
  
  <p>It has 3 addresses.</p>
  
  <p>And I want to capitalize the streets start with "b" only. My code is mess like following:</p>
  
  <pre><code>val modified = employee.copy(company = employee.company.copy(addresses = 
      employee.company.addresses.map { address =&gt;
          address.copy(street = address.street.copy(name = {
            if (address.street.name.startsWith("b")) {
              address.street.name.capitalize
            } else {
              address.street.name
            }
          }))
        }))
  </code></pre>
  
  <p>The <code>modified</code> employee is then:</p>
  
  <pre><code>Employee(Company(List(
      Address(Street(aaa street)), 
      Address(Street(Bbb street)), 
      Address(Street(Bpp street)))))
  </code></pre>
  
  <p>I'm looking for a way to improve it, and can't find one. Even tried <a href="https://github.com/julien-truffaut/Monocle">Monocle</a>, but can't apply it to this problem.</p>
  
  <p>Is there any way to make it better?</p>
  
  <hr>
  
  <p>PS: there are two key requirements:</p>
  
  <ol>
  <li>use only immutable data</li>
  <li>don't lose other existing fields</li>
  </ol>