@Injectable()
class TodosQuery {
  getVisibilityFilter$ = this.store.select(state => state.visibilityFilter);
  getTodos$ = this.store.select(state => state.todos);
  getKeyword$ = this.store.select(state => state.keyword);  
  getVisibleTodos$ = Observable.combineLatest(
    getVisibilityFilter$, getTodos$, this.calcVisibleTodos
  )
  private calcVisibleTodos = (visibilityFilter, todos) => {
      switch (visibilityFilter) {
        case 'SHOW_ALL':
          return todos
        case 'SHOW_COMPLETED':
          return todos.filter(t => t.completed)
        case 'SHOW_ACTIVE':
          return todos.filter(t => !t.completed)
      }
  }
  getVisibleTodosFilteredByKeyword$ = Observable.combineLatest(
    getVisibleTodos$, getKeyword$,
    (visibleTodos, keyword) => visibleTodos.filter(
      todo => todo.text.includes(keyword)
    )
  )
  constructor(private store: Store<AppState>) {}
    
}