I am not so into JavaScript\TypeScript and I have some problem to understand how exactly works this example used into an Angular application to retrieve data from a Firebase database. It works fine but I have some doubts about its logic (I think that it should be something related to functional programming paradigm and I am not so into this topic).
So I have this code that uses Angularfire2 library (the new ^5.0.0-rc.4 version) to query my Firebase DB:
@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'app';
   courses$: Observable<{}[]>;
    constructor(private db: AngularFireDatabase) {
        console.log("TEST");
        this.courses$ = db.list('courses').snapshotChanges()
            .map(actions => {
                return actions.map(action => ({
                    $key: action.key,
                    value: action.payload.val(),
                }))
            });
        this.courses$.subscribe(console.log);
    }
}
So the courses$ variable it shoul be an array of Observable (is it correct?). From what I know the Observable is an Object that emit events that can be subscribed. It will contain a list retrieved from Firebase DB.
This code section:
db.list('courses')
should simply create the binding with the courses node into my Firebase database (that contains itself a list of node) as a list. But I am not so sure if my interpretation is correct or if I am missing something.
Then on this binding is called the snapshotChanges() that should return an Observable. 
Here I have the following doubts:
- This - Observableis related to a single element of the list of courses that I am retrieving or to the whole list of courses retrieved from the DB? (I think the second one but I am not so sure).
- The exact type returned by the - snapshotChanges()method seems to be- Observable<SnapshotAction[]>. So what exactly means. It is an Observable that have an array of- SnapshotActionas type. What exactly is and what exactly means?
Then there is this map() function:
.map(actions => {
    return actions.map(action => ({
        $key: action.key,
        value: action.payload.val(),
    }))
});
Here I am pretty stuck...I think that it is the more functional section. I think that it used to create my output each time that something changes into the observed courses$.
Reading the documentation it seems that the map() method creates a new array (infact I am creating an array) with the results of calling a provided function on every element in this array.
So it should mean that this is the function called on each element of array:
actions => {
    return actions.map(action => ({
        $key: action.key,
        value: action.payload.val(),
    }))
}
But what array? I think that it should be the previous Observable<SnapshotAction[]> returned by snapshotChanges() method.
I am absolutly not sure about this assertion....
So the idea is that every time that a change happens into the subscribed courses$ observable the map() method is executed on the new data... But I think that I am missing a lot of intermediate stuff
How exactly does this work?
 
     
     
    