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