on 1ed37fe help sign in
elk/libraries/Native/String.js
251 lines 6.3 kB history raw
1Elm.Native.String = {};
2Elm.Native.String.make = function(elm) {
3 elm.Native = elm.Native || {};
4 elm.Native.String = elm.Native.String || {};
5 if (elm.Native.String.values) return elm.Native.String.values;
6 if ('values' in Elm.Native.String)
7 return elm.Native.String.values = Elm.Native.String.values;
9 var Char = Elm.Char.make(elm);
10 var Maybe = Elm.Maybe.make(elm);
11 var JS = Elm.JavaScript.make(elm);
12 var Utils = Elm.Native.Utils.make(elm);
14 function isEmpty(str) {
15 return str.length === 0;
16 }
17 function cons(chr,str) {
18 return chr + str;
19 }
20 function uncons(str) {
21 var hd;
22 return (hd = str[0]) ? Maybe.Just(Utils.Tuple2(Utils.chr(hd), str.slice(1)))
23 : Maybe.Nothing;
24 }
25 function append(a,b) {
26 return a + b;
27 }
28 function concat(strs) {
29 return JS.fromList(strs).join('');
30 }
31 function length(str) {
32 return str.length;
33 }
34 function map(f,str) {
35 var out = str.split('');
36 for (var i = out.length; i--; ) {
37 out[i] = f(Utils.chr(out[i]));
38 }
39 return out.join('');
40 }
41 function filter(pred,str) {
42 return str.split('').map(Utils.chr).filter(pred).join('');
43 }
44 function reverse(str) {
45 return str.split('').reverse().join('');
46 }
47 function foldl(f,b,str) {
48 var len = str.length;
49 for (var i = 0; i < len; ++i) {
50 b = A2(f, Utils.chr(str[i]), b);
51 }
52 return b;
53 }
54 function foldr(f,b,str) {
55 for (var i = str.length; i--; ) {
56 b = A2(f, Utils.chr(str[i]), b);
57 }
58 return b;
59 }
61 function split(sep, str) {
62 return JS.toList(str.split(sep));
63 }
64 function join(sep, strs) {
65 return JS.fromList(strs).join(sep);
66 }
67 function repeat(n, str) {
68 var result = '';
69 while (n > 0) {
70 if (n & 1) result += str;
71 n >>= 1, str += str;
72 }
73 return result;
74 }
76 function sub(start, end, str) {
77 return str.slice(start,end);
78 }
79 function left(n, str) {
80 return n < 1 ? "" : str.slice(0,n);
81 }
82 function right(n, str) {
83 return n < 1 ? "" : str.slice(-n);
84 }
85 function dropLeft(n, str) {
86 return n < 1 ? str : str.slice(n);
87 }
88 function dropRight(n, str) {
89 return n < 1 ? str : str.slice(0,-n);
90 }
92 function pad(n,chr,str) {
93 var half = (n - str.length) / 2;
94 return repeat(Math.ceil(half),chr) + str + repeat(half|0,chr);
95 }
96 function padRight(n,chr,str) {
97 return str + repeat(n - str.length, chr);
98 }
99 function padLeft(n,chr,str) {
100 return repeat(n - str.length, chr) + str;
101 }
103 function trim(str) {
104 return str.trim();
105 }
106 function trimLeft(str) {
107 return str.trimLeft();
108 }
109 function trimRight(str) {
110 return str.trimRight();
111 }
113 function words(str) {
114 return JS.toList(str.split(/\s+/g));
115 }
116 function lines(str) {
117 return JS.toList(str.split(/\r\n|\r|\n/g));
118 }
120 function toUpper(str) {
121 return str.toUpperCase();
122 }
123 function toLower(str) {
124 return str.toLowerCase();
125 }
127 function any(pred, str) {
128 for (var i = str.length; i--; ) {
129 if (pred(Utils.chr(str[i]))) return true;
130 }
131 return false;
132 }
133 function all(pred, str) {
134 for (var i = str.length; i--; ) {
135 if (!pred(Utils.chr(str[i]))) return false;
136 }
137 return true;
138 }
140 function contains(sub, str) {
141 return str.indexOf(sub) > -1;
142 }
143 function startsWith(sub, str) {
144 return str.indexOf(sub) === 0;
145 }
146 function endsWith(sub, str) {
147 return str.lastIndexOf(sub) === str.length - sub.length;
148 }
149 function indexes(sub, str) {
150 var subLen = sub.length;
151 var i = 0;
152 var is = [];
153 while ((i = str.indexOf(sub, i)) > -1) {
154 is.push(i);
155 i = i + subLen;
156 }
157 return JS.toList(is);
158 }
160 function toInt(s) {
161 var len = s.length;
162 if (len === 0) { return Maybe.Nothing; }
163 var start = 0;
164 if (s[0] == '-') {
165 if (len === 1) { return Maybe.Nothing; }
166 start = 1;
167 }
168 for (var i = start; i < len; ++i) {
169 if (!Char.isDigit(s[i])) { return Maybe.Nothing; }
170 }
171 return Maybe.Just(parseInt(s, 10));
172 }
174 function toFloat(s) {
175 var len = s.length;
176 if (len === 0) { return Maybe.Nothing; }
177 var start = 0;
178 if (s[0] == '-') {
179 if (len === 1) { return Maybe.Nothing; }
180 start = 1;
181 }
182 var dotCount = 0;
183 for (var i = start; i < len; ++i) {
184 if (Char.isDigit(s[i])) { continue; }
185 if (s[i] === '.') {
186 dotCount += 1;
187 if (dotCount <= 1) { continue; }
188 }
189 return Maybe.Nothing;
190 }
191 return Maybe.Just(parseFloat(s));
192 }
194 function toList(str) {
195 return JS.toList(str.split('').map(Utils.chr));
196 }
197 function fromList(chars) {
198 return JS.fromList(chars).join('');
199 }
201 return Elm.Native.String.values = {
202 isEmpty: isEmpty,
203 cons: F2(cons),
204 uncons: uncons,
205 append: F2(append),
206 concat: concat,
207 length: length,
208 map: F2(map),
209 filter: F2(filter),
210 reverse: reverse,
211 foldl: F3(foldl),
212 foldr: F3(foldr),
214 split: F2(split),
215 join: F2(join),
216 repeat: F2(repeat),
218 sub: F3(sub),
219 left: F2(left),
220 right: F2(right),
221 dropLeft: F2(dropLeft),
222 dropRight: F2(dropRight),
224 pad: F3(pad),
225 padLeft: F3(padLeft),
226 padRight: F3(padRight),
228 trim: trim,
229 trimLeft: trimLeft,
230 trimRight: trimRight,
232 words: words,
233 lines: lines,
235 toUpper: toUpper,
236 toLower: toLower,
238 any: F2(any),
239 all: F2(all),
241 contains: F2(contains),
242 startsWith: F2(startsWith),
243 endsWith: F2(endsWith),
244 indexes: F2(indexes),
246 toInt: toInt,
247 toFloat: toFloat,
248 toList: toList,
249 fromList: fromList,
250 };
251};