code: func (l *List) FindItems(mainSearch, secondarySearch string, mustContainBoth, ignoreCase bool) (indices []int) {
  	if mainSearch == "" && secondarySearch == "" {
  		return
  	}
  
  	if ignoreCase {
  		mainSearch = strings.ToLower(mainSearch)
  		secondarySearch = strings.ToLower(secondarySearch)
  	}
  
  	for index, item := range l.items {
  		mainText := item.MainText
  		secondaryText := item.SecondaryText
  		if ignoreCase {
  			mainText = strings.ToLower(mainText)
  			secondaryText = strings.ToLower(secondaryText)
  		}
  
  		// strings.Contains() always returns true for a "" search.
  		mainContained := strings.Contains(mainText, mainSearch)
  		secondaryContained := strings.Contains(secondaryText, secondarySearch)
  		if mustContainBoth && mainContained && secondaryContained ||
  			!mustContainBoth && (mainText != "" && mainContained || secondaryText != "" && secondaryContained) {
  			indices = append(indices, index)
  		}
  	}
  
  	return
  }
docs: // FindItems searches the main and secondary texts for the given strings and
  // returns a list of item indices in which those strings are found. One of the
  // two search strings may be empty, it will then be ignored. Indices are always
  // returned in ascending order.
  //
  // If mustContainBoth is set to true, mainSearch must be contained in the main
  // text AND secondarySearch must be contained in the secondary text. If it is
  // false, only one of the two search strings must be contained.
  //
  // Set ignoreCase to true for case-insensitive search.