“use strict”;

module.exports = CSSselect;

var Pseudos = require(“./lib/pseudos.js”),

DomUtils      = require("domutils"),
findOne       = DomUtils.findOne,
findAll       = DomUtils.findAll,
getChildren   = DomUtils.getChildren,
removeSubsets = DomUtils.removeSubsets,
falseFunc     = require("boolbase").falseFunc,
compile       = require("./lib/compile.js"),
compileUnsafe = compile.compileUnsafe,
compileToken  = compile.compileToken;

function getSelectorFunc(searchFunc){

return function select(query, elems, options){
if(typeof query !== "function") query = compileUnsafe(query, options, elems);
if(!Array.isArray(elems)) elems = getChildren(elems);
        else elems = removeSubsets(elems);
        return searchFunc(query, elems);
};

}

var selectAll = getSelectorFunc(function selectAll(query, elems){

return (query === falseFunc || !elems || elems.length === 0) ? [] : findAll(query, elems);

});

var selectOne = getSelectorFunc(function selectOne(query, elems){

return (query === falseFunc || !elems || elems.length === 0) ? null : findOne(query, elems);

});

function is(elem, query, options){

return (typeof query === "function" ? query : compile(query, options))(elem);

}

/*

the exported interface

*/ function CSSselect(query, elems, options){

return selectAll(query, elems, options);

}

CSSselect.compile = compile; CSSselect.filters = Pseudos.filters; CSSselect.pseudos = Pseudos.pseudos;

CSSselect.selectAll = selectAll; CSSselect.selectOne = selectOne;

CSSselect.is = is;

//legacy methods (might be removed) CSSselect.parse = compile; CSSselect.iterate = selectAll;

//hooks CSSselect._compileUnsafe = compileUnsafe; CSSselect._compileToken = compileToken;