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