1 
2 module ws..string;
3 
4 public import std.string;
5 import std.conv;
6 
7 __gshared:
8 
9 static dchar formatChar = '%';
10 
11 string tostring(Args...)(Args args){
12 	try {
13 		static if(args.length > 0){
14 			static if(is(typeof(args[0]) == string) && args.length >= 2){
15 				if(args[0].find(formatChar) < args[0].length){
16 					size_t i = args[0].find(formatChar);
17 					return args[0][0..i] ~ to!string(args[1]) ~ tostring(args[0][i+1..$], args[2..$]);
18 				}else
19 					return args[0] ~ to!string(args[1]) ~ tostring(args[2..$]);
20 			}else
21 				return to!string(args[0]) ~ tostring(args[1..$]);
22 		}else
23 			return "";
24 	}catch(Exception e){
25 		return "tostring error\n" ~ e.toString();
26 	}
27 }
28 
29 size_t find(string s, string what, size_t start = 0){
30 	size_t right = 0;
31 	foreach(i, c; s){
32 		if(c == what[right])
33 			right++;
34 		else
35 			right = 0;
36 		if(right == what.length)
37 			return i - right + 1;
38 	}
39 	return s.length;
40 }
41 
42 size_t find(string s, dchar what, size_t start = 0){
43 	for(; start < s.length; start++)
44 		if(s[start] == what)
45 			return start;
46 	return s.length;
47 }
48 
49 unittest {
50 	auto s = "hello there";
51 	assert(s.find("there!") == s.length);
52 	assert(s.find("there") == 6);
53 	assert(s.find('r') == 9);
54 }
55 
56 /*
57 size_t findLast(string s, string what, size_t start = 0){
58 	size_t right = 0;
59 	foreach_reverse(i, c; s){
60 		if(c == what[$-right])
61 			right++;
62 		else
63 			right = 0;
64 		if(right == what.length)
65 			return i - right + 1;
66 	}
67 	return s.length;
68 }
69 */
70 
71 size_t findLast(string s, dchar what, size_t start = 0){
72 	if(!start) start = s.length-1;
73 	for(; start < s.length; start--)
74 		if(s[start] == what)
75 			return start;
76 	return s.length;
77 }
78 
79 unittest {
80 	assert("hello there".findLast('l') == 3);
81 }
82 
83 string[] split(string what, string splitter){
84 	string[] v;
85 	string tmp = what;
86 	for(size_t i = tmp.find(splitter); i < tmp.length; i = tmp.find(splitter)){
87 		v ~= tmp[0..i];
88 		tmp = tmp[i+splitter.length..$];
89 	}
90 	if(tmp.length)
91 		v ~= tmp;
92 	return v;
93 }
94 
95 string[] split(string what, dchar splitter){
96 	string[] v;
97 	size_t last = 0;
98 	foreach(i, dchar c; what){
99 		if(c == splitter){
100 			v ~= what[last .. i];
101 			last = i+1;
102 		}
103 	}
104 	if(last < what.length)
105 		v ~= what[last..$];
106 	return v;
107 }
108 
109 
110 unittest {
111 	assert("a b c d efg".split(" ") == ["a", "b", "c", "d", "efg"]);
112 }