code: func (api *PublicFilterAPI) GetFilterChanges(id rpc.ID) (interface{}, error) {
  	api.filtersMu.Lock()
  	defer api.filtersMu.Unlock()
  
  	if f, found := api.filters[id]; found {
  		if !f.deadline.Stop() {
  			// timer expired but filter is not yet removed in timeout loop
  			// receive timer value and reset timer
  			<-f.deadline.C
  		}
  		f.deadline.Reset(deadline)
  
  		switch f.typ {
  		case PendingTransactionsSubscription, BlocksSubscription:
  			hashes := f.hashes
  			f.hashes = nil
  			return returnHashes(hashes), nil
  		case LogsSubscription:
  			logs := f.logs
  			f.logs = nil
  			return returnLogs(logs), nil
  		}
  	}
  
  	return []interface{}{}, fmt.Errorf("filter not found")
  }
docs: // GetFilterChanges returns the logs for the filter with the given id since
  // last time it was called. This can be used for polling.
  //
  // For pending transaction and block filters the result is []common.Hash.
  // (pending)Log filters return []Log.
  //
  // https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_getfilterchanges