Mercurial > repos > rhope
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 }