diff options
author | Louis Pilfold <louis@lpil.uk> | 2021-08-26 19:45:32 +0100 |
---|---|---|
committer | Louis Pilfold <louis@lpil.uk> | 2021-08-26 19:45:32 +0100 |
commit | 06dc009d7d3551a1c4fc5ec8a81376e88658585a (patch) | |
tree | a5ea94336907152eb7a684efe6e0821bbaaab2a6 | |
parent | e57d2b2dd56742eddc60f1931ba301b687bcea29 (diff) | |
download | gleam_stdlib-06dc009d7d3551a1c4fc5ec8a81376e88658585a.tar.gz gleam_stdlib-06dc009d7d3551a1c4fc5ec8a81376e88658585a.zip |
Update for bit string prelude
-rw-r--r-- | src/gleam/should.gleam | 2 | ||||
-rw-r--r-- | src/gleam_stdlib.js | 68 |
2 files changed, 20 insertions, 50 deletions
diff --git a/src/gleam/should.gleam b/src/gleam/should.gleam index 5a636d0..044190f 100644 --- a/src/gleam/should.gleam +++ b/src/gleam/should.gleam @@ -24,7 +24,7 @@ if javascript { import gleam/string external fn stringify(anything) -> String = - "../gleam_stdlib.js" "stringify" + "../gleam.js" "inspect" external fn crash(String) -> anything = "../gleam_stdlib.js" "crash" diff --git a/src/gleam_stdlib.js b/src/gleam_stdlib.js index d228d3a..e04943a 100644 --- a/src/gleam_stdlib.js +++ b/src/gleam_stdlib.js @@ -1,11 +1,14 @@ -import { Ok, Error, List } from "./gleam.js"; +import { + Ok, + Error, + List, + BitString, + toBitString, + stringBits, +} from "./gleam.js"; const Nil = undefined; -function to_list(array) { - return List.fromArray(array); -} - export function identity(x) { return x; } @@ -106,7 +109,7 @@ export function equal(a, b) { } export function split(xs, pattern) { - return to_list(xs.split(pattern)); + return List.fromArray(xs.split(pattern)); } export function join(xs) { @@ -114,12 +117,8 @@ export function join(xs) { } export function byte_size(data) { - if (data instanceof Uint8Array) { - return data.byteLength; - } else if (typeof Blob === "function") { - return new Blob([data]).size; - } else if (typeof Buffer === "function") { - return Buffer.byteLength(data); + if (data instanceof BitString) { + return data.size(); } else { return data.length; } @@ -169,59 +168,29 @@ export function trim_right(string) { } export function bit_string_from_string(string) { - return new TextEncoder().encode(string); + return new toBitString([stringBits(string)]); } export function bit_string_append(first, second) { - let array = new Uint8Array(first.byteLength + second.byteLength); - array.set(first, 0); - array.set(second, first.byteLength); - return array; -} - -function reduce_list(list, acc, f) { - let [current, next] = list; - while (next) { - acc = f(acc, current); - [current, next] = next; - } - return acc; + return new toBitString([first.buffer, second.buffer]); } export function bit_string_concat(bit_strings) { - let size = reduce_list(bit_strings, 0, (size, b) => b.byteLength + size); - let array = new Uint8Array(size); - reduce_list(bit_strings, 0, (index, bit_string) => { - array.set(bit_string, index); - return index + bit_string.byteLength; - }); - return array; + return toBitString(bit_strings.toArray().map((b) => b.buffer)); } export function log(term) { console.log(term); } -export function stringify(data) { - let replacer = (_key, value) => { - if (typeof value === "bigint") return value.toString() + "n"; - if (typeof value === "undefined") return null; - return value; - }; - try { - return JSON.stringify(data, replacer); - } catch (_error) { - return "//reference-cycle"; - } -} - export function crash(message) { throw new globalThis.Error(message); } export function bit_string_to_string(bit_string) { try { - return new Ok(new TextDecoder("utf-8", { fatal: true }).decode(bit_string)); + let decoder = new TextDecoder("utf-8", { fatal: true }); + return new Ok(decoder.decode(bit_string.buffer)); } catch (_error) { return new Error(undefined); } @@ -258,6 +227,7 @@ export function power(base, exponent) { export function bit_string_slice(bits, position, length) { let start = Math.min(position, position + length); let end = Math.max(position, position + length); - if (start < 0 || end > bits.byteLength) return new Error(Nil); - return new Ok(new Uint8Array(bits.buffer, start, Math.abs(length))); + if (start < 0 || end > bits.size()) return new Error(Nil); + let buffer = new Uint8Array(bits.buffer.buffer, start, Math.abs(length)); + return new Ok(new BitString(buffer)); } |