export default function(encode) {
return function(strs, ...values) {
return strs
.map(function(item, i) {
let val = typeof values[i] === 'undefined' ? '' : values[i];
switch (true) {
case typeof val === 'string':
val = encode(val);
break;
case Array.isArray(val):
val = val
.map(function(item) {
return `${encode(item)}`;
}, '')
.join('/');
case typeof val === 'object':
val = Object.keys(val)
.reduce(function(prev, key) {
if (val[key] === null) {
return prev.concat(`${encode(key)}`);
} else if (typeof val[key] !== 'undefined') {
return prev.concat(`${encode(key)}=${encode(val[key])}`);
}
return prev;
}, [])
.join('&');
return `${item}${val}`;
})
.join('')
.trim();
};