docs: function search(transforms, dataList, searchString) {
    var resultList;
  
    //validating inputs
    if (!dataList || !isObjectOrArray(dataList)) throw new SyntaxError(messages.DataMustBeArrayOrObject);
    if (isArrayAndContainsNonString(dataList)) throw new SyntaxError(messages.DataMustBeStringArray);
    if ('string' !== typeof searchString) throw new SyntaxError(messages.SearchStringMustBeString);
  
    //no transforms warning
    if (!transforms || !Object.keys(transforms).length) {
      console.warn(messages.NoTransformsWarning);
      transforms = {};
    }
  
    //validations done
    //start actual logic
  
    //return dataList as is, if
    //  - dataList is an array and is empty
    //  - dataList is an object
    //    * it has data prop which is an array and that data prop is an empty array
    //    * it has searchInProps property which is an array and is empty
    //  - dataList is an empty object i.e., {}
    if (
      dataList.length <= 0                                            ||
      (dataList.data && dataList.data.length <= 0)                    ||
      (dataList.searchInProps && dataList.searchInProps.length <= 0)  ||
      Object.keys(dataList).length <= 0
    ) return dataList;
  
  
    //get matched list
    resultList = util.getMatchedList(dataList, util.getRegex(searchString));
    if (isArray(resultList)) {
      //remove all `null` elements from array
      resultList = resultList.filter(function(v) {
        return !!v;
      });
    }
    else {
      resultList.data = resultList.data.filter(function(v) {
        return !!v;
      });
    }
  
    //apply transforms
    Object.keys(transforms).forEach(function(v) {
      if ('function' !== typeof transforms[v]) throw new SyntaxError(messages.TransformMustBeSingleArgFunction);
      resultList = transforms[v](resultList);
    });
  
    //return result
    return resultList;
  }