| 
					
				 | 
			
			
				@@ -1,6 +1,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 -module(word_split). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 -export([words/1, to_list/1]). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+%%-include_lib("src/ebb_flow.erl"). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 % data WordState = {chunk, S} | {segment, L, C, R} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -25,27 +26,36 @@ maybe_word("") -> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 maybe_word(S) -> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     singleton(S). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-process_char($ ) -> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    {segment, "", nil(), ""}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 process_char(C) -> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    {chunk, [C]}. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    case lists:member(C, " \t\n\f\l") of 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	true -> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	    {segment, "", nil(), ""}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	false -> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	    {chunk, [C]} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    end. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 combine({chunk, S1}, {chunk, S2}) -> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     {chunk, S1 ++ S2}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 combine({chunk, S}, {segment, L, C, R}) -> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    {segment, L ++ S, C, R}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    {segment, S ++ L, C, R}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 combine({segment, L, C, R}, {chunk, S}) -> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     {segment, L, C, R ++ S}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 combine({segment, L1, C1, R1}, {segment, L2, C2, R2}) -> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     {segment, L1, conc(C1, conc(maybe_word(R1 ++ L2), C2)), R2}. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-words([X|XS]) -> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    T = lists:foldl(fun(A, B) -> combine(B, A) end, process_char(X), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		    lists:map(fun(C) -> process_char(C) end, XS)), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    case T of 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	{chunk, C} -> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	    maybe_word(C); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+head([X|_]) -> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    X. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+words(Str) -> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    T = ebb_flow:map_reduce(fun process_char/1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			    fun combine/2, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			    Str), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    case head(ebb_run:run_linear(T)) of 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	{chunk, S} -> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	    maybe_word(S); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	{segment, L, C, R} -> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	    conc(maybe_word(L), conc(C, maybe_word(R))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	    conc(maybe_word(L), conc(C, maybe_word(R))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	_ -> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	    error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     end. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 |