Operador angular de 6 tubos RxJs para encadenar 3 observables dependientes

Tengo 3 recursos dependientes de la API Rest (digamos observables) como este:

1st observable produce un elemento como conjunto de usuarios, como este:

getUsers(): Observable<User[]>
    [
      {
        "id": 1,
        "name": "Peter",
        "surname": "Smith"
      },
      {
        "id": 2,
        "name": "John",
        "surname": "Wayne"
      },
      ...
    ]

2nd observable se puede usar para obtener direcciones asignadas al usuario, por lo que el parámetro de entrada es ID de usuario y devuelve un elemento como conjunto de direcciones:

getUserAddresses(user_id: string): Observable<Address[]>
    [
      {
        "id": 1,
        "city": "London",
        "street": "Wicombe 34"
      },
      {
        "id": 2,
        "city": "Paris",
        "street": "La fever 20"
      },
      ...
    ]

3rd observable se puede utilizar para buscar empresas asignadas al usuario, por lo que el parámetro de entrada es ID de usuario y devuelve un elemento como conjunto de empresas:

getUserCompanies(user_id: string): Observable<Company[]>
    [
      {
        "id": 1,
        "name": "Fintch CO",
        "state": "France"
      },
      {
        "id": 2,
        "name": "C&C inc.",
        "state": "USA"
      },
      ...
    ]

Quiero encadenar estos 3 observables en uno que produzca el resultado nuevamente como un elemento, que contendrá una matriz de usuarios con sus matrices de direcciones adicionales y matriz de empresas, como las siguientes:

    [
      {
        "id": 1,
        "name": "Peter",
        "surname": "Smith",
        "addreesses": 
               [
                 {
                   "id": "1",
                   "city": "London",
                   "street": "Wicombe 34"
                 },
                 {
                   "id": "2",
                   "city": "",
                   "street": "La fever 20"
                 }
               ],
        "companies": 
               [
                 {
                   "id": "1",
                   "name": "Fintch CO",
                   "state": "France"
                 },
                 {
                   "id": "2",
                   "name": "C&C inc.",
                   "state": "USA"
                 }
               ]
        }
      },
      {
        "id": 2,
        "name": "John",
        "surname": "Wayne",
        "addresses": [...],
        "companies": [...],
      },
      ...
    ]

¿Cómo debería parecerse a los operadores compuestos para lograr eso en Angular 6 con RxJs 6? Muchas gracias por los consejos.

Respuestas a la pregunta(3)

Su respuesta a la pregunta