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