<?php
function coalesce($value, $empty) { return isset($value) ? $value : $empty; }

function starts_with($str, $prefix)
{
	return substr($str, 0, strlen($prefix)) === $prefix;
}

function ends_with($str, $suffix)
{
	return substr($str, -strlen($suffix)) === $suffix;
}

function rm_prefix($prefix, $str)
{
	return starts_with($str, $prefix) ? substr($str, strlen($prefix)) : $str;
}

function rm_suffix($suffix, $str)
{
	return ends_with($str, $suffix) ?
		substr($str, 0, strlen($str) - strlen($suffix)) : $str;
}

function ensure_prefix($prefix, $str)
{
	return starts_with($str, $prefix) ? $str : $prefix.$str;
}

function ensure_suffix($suffix, $str)
{
	return ends_with($str, $suffix) ? $str : $str.$suffix;
}

class Path
{
	public $head;
	public $tail;
	
	function Path($head, $tail="")
	{
		$this->head = $head;
		$this->tail = $tail;
	}
}

function partition($str, $delim)
{
	$delim_idx = strpos($str, $delim);
	return $delim_idx !== false ? new Path(substr($str, 0, $delim_idx),
		substr($str, $delim_idx+strlen($delim))) : new Path($str);
}

function array_non_empty($array)
{
	foreach ($array as $key => $value)
		if (!isset($value) || $value === "") unset($array[$key]);
	return $array;
}

function join_non_empty($delim, $array)
{
	return implode($delim, array_non_empty($array));
}

function parse_dot_path($path) { return partition($path, "."); }

function parse_mixed_path($path)
{
	preg_match('/^([\w-]*)(.*)$/', $path, $path);
	return new Path($path[1], rm_prefix(".", $path[2]));
}

function strip_url($url) { return rm_suffix("#", $url); }
?>
