view pattern.rhope @ 156:ed70399a07aa

Add Substring method to string and improve performance of Partition
author Mike Pavone <pavone@retrodev.com>
date Thu, 23 Dec 2010 02:00:27 +0000
parents d86df83402f3
children f97a7d499182
line wrap: on
line source


Blueprint Empty Pattern
{
}

Empty Pattern[:out]
{
	out <- Build[Empty Pattern()]
}

Add String@Empty Pattern[pattern,string,idx:out]
{
	out <- [pattern]_Add String[string,0,idx]
}

_Add String@Empty Pattern[pattern,string,n,idx:out]
{
	If[[n]<[[string]Byte Length]]
	{
		out <- [[[[[[Build[Pattern()]
		]Byte <<[[string]Byte[n]]
		]Left <<[pattern]
		]Right <<[pattern]
		]Straight <<[[pattern]_Add String[string, [n]+[1],idx]]
		]Terminal? <<[[n]=[[[string]Byte Length]-[1]]]
		]Index <<[idx]
	}{
		out <- pattern
	}
}

Blueprint Pattern
{
	Byte
	Left
	Right
	Straight
	Terminal?
	Index
}

_Add String@Pattern[pattern,string,n,idx:out]
{
	If[[n]<[[string]Byte Length]]
	{
		b <- [string]Byte[n]
		myb <- [pattern]Byte >>
		If[[b]<[myb]]
		{
			out <- [pattern]Left <<[[[pattern]Left >>]_Add String[string,n,idx]]
		}{
			If[[b]>[myb]]
			{
				out <- [pattern]Right <<[[[pattern]Right >>]_Add String[string,n,idx]]
			}{
				newpat <- [pattern]Straight <<[[[pattern]Straight >>]_Add String[string,[n]+[1],idx]]
				If[[n]=[[[string]Byte Length]-[1]]]
				{
					out <- [newpat]Terminal? <<[Yes]
				}{
					out <- Val[newpat]
				}
			}
		}
	}{
		out <- pattern
	}
}

Add String@Pattern[pattern,string,idx:out]
{
	out <- [pattern]_Add String[string,0,idx]
}

Pattern@List[list:out]
{
	out <- Fold[Add String[?], Empty Pattern[], list]
}

Pattern@List Leaf[list:out]
{
        out <- Fold[Add String[?], Empty Pattern[], list]
}

Pattern@Pattern[p:out]
{
	out <- p
}

_Match@Empty Pattern[pattern,string,n:num,no match]
{
	no match <- Yes
}

Match@Empty Pattern[pattern,string:num,no match]
{
	no match <- Yes
}

Match@Pattern[pattern,string:num,no match,idx]
{
	num,no match,idx <- [pattern]_Match[string,0,[string]Byte[0]]
}

_Match@Pattern[pattern,string,n,b:num,no match,idx]
{
	myb <- [pattern]Byte >>
	If[[b]=[myb]]
	{
		,check terminal <- [string]Byte[[n]+[1]]
		{ num,check terminal,idx <- [[pattern]Straight >>]_Match[string, [n]+[1], ~] }
		Val[check terminal]
		{
			,no match <- If[[pattern]Terminal? >>]
			{
				num <- [n]+[1]
				idx <- Index >>[pattern]
			}
		}
	
	}{
		If[[b]<[myb]]
		{
			num, no match, idx <- [[pattern]Left >>]_Match[string, n,b]
		}{
			num, no match, idx <- [[pattern]Right >>]_Match[string, n,b]
		}
	}
}

_Partition@Pattern[delims,string:matched,after,not found]
{
        not found <- If[[string]=[""]] {}
        {
                [delims]Match[string]
                {
                        matched,after <- [string]Slice[~]
                }{
                        matched,after,not found <- _Partition[delims, [string]Substring[1, 0]]
                }
        }
}

_Partition@Empty Pattern[delims,string:matched,after,not found]
{
	not found <- Yes
}