function is_undef(value) { return typeof value === 'undefined' }

function coalesce(value, empty) { return !is_undef(value) ? value : empty }

function starts_with(str, prefix)
{
	return str.substr(0, prefix.length) === prefix
}

function ends_with(str, suffix) { return str.substr(-suffix.length) === suffix }

function rm_prefix(prefix, str)
{
	return starts_with(str, prefix) ? str.substr(prefix.length) : str
}

function rm_suffix(suffix, str)
{
	return ends_with(str, suffix) ?
		str.substr(0, str.length - suffix.length) : str
}

function partition(str, delim)
{
	var delim_idx = str.indexOf(delim)
	return delim_idx >= 0 ? {head: str.substr(0, delim_idx),
		tail: str.substr(delim_idx+delim.length)} : {head: str, tail: ''}
}

function parse_dot_path(path) { return partition(path, '.') }

function parse_mixed_path(path)
{
	path = /^([\w-]*)(.*)$/.exec(path)
	return {head: path[1], tail: rm_prefix('.', path[2])}
}

function strip_url(url) { return rm_suffix('#', url) }
