Skip to content

Commit

Permalink
refactor(transducers-binary): remove duplicate code in bytes(), updat…
Browse files Browse the repository at this point in the history
…e ut8Length
  • Loading branch information
postspectacular committed Aug 18, 2019
1 parent acaa38e commit 021fd6f
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 56 deletions.
71 changes: 28 additions & 43 deletions packages/transducers-binary/src/bytes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,11 +65,26 @@ export function bytes(cap = 1024, src?: Iterable<BinStructItem>) {
return buf;
};

const setArray = (
fn: string,
stride: number,
acc: Uint8Array,
x: any,
le: boolean
) => {
const n = x.length;
acc = ensure(acc, stride * n);
for (let i = 0; i < n; i++, pos += stride) {
(<any>view)[fn](pos, x[i], le);
}
return acc;
};

return src
? reduce(bytes(cap), src)
: <Reducer<Uint8Array, BinStructItem>>[
() => new Uint8Array(cap),
(acc) => acc.slice(0, pos),
(acc) => acc.subarray(0, pos),
(acc, [type, x, le = false]) => {
if (!view || view.buffer !== acc.buffer) {
cap = acc.byteLength;
Expand Down Expand Up @@ -108,79 +123,49 @@ export function bytes(cap = 1024, src?: Iterable<BinStructItem>) {
view.setInt16(pos, <number>x, le);
pos += 2;
break;
case Type.I16_ARRAY: {
x = <ArrayLike<number>>x;
const n = x.length;
acc = ensure(acc, 2 * n);
for (let i = 0; i < n; i++, pos += 2)
view.setInt16(pos, x[i], le);
case Type.I16_ARRAY:
acc = setArray("setInt16", 2, acc, x, le);
break;
}
case Type.U16:
acc = ensure(acc, 4);
view.setUint16(pos, <number>x, le);
pos += 4;
break;
case Type.U16_ARRAY: {
x = <ArrayLike<number>>x;
const n = x.length;
acc = ensure(acc, 2 * n);
for (let i = 0; i < n; i++, pos += 2)
view.setUint16(pos, x[i], le);
case Type.U16_ARRAY:
acc = setArray("setUint16", 2, acc, x, le);
break;
}
case Type.I32:
acc = ensure(acc, 4);
view.setInt32(pos, <number>x, le);
pos += 4;
break;
case Type.I32_ARRAY: {
x = <ArrayLike<number>>x;
const n = x.length;
acc = ensure(acc, 4 * n);
for (let i = 0; i < n; i++, pos += 4)
view.setInt32(pos, x[i], le);
case Type.I32_ARRAY:
acc = setArray("setInt32", 4, acc, x, le);
break;
}
case Type.U32:
acc = ensure(acc, 4);
view.setUint32(pos, <number>x, le);
pos += 4;
break;
case Type.U32_ARRAY: {
x = <ArrayLike<number>>x;
const n = x.length;
acc = ensure(acc, 4 * n);
for (let i = 0; i < n; i++, pos += 4)
view.setUint32(pos, x[i], le);
case Type.U32_ARRAY:
acc = setArray("setUint32", 4, acc, x, le);
break;
}
case Type.F32:
acc = ensure(acc, 4);
view.setFloat32(pos, <number>x, le);
pos += 4;
break;
case Type.F32_ARRAY: {
x = <ArrayLike<number>>x;
const n = x.length;
acc = ensure(acc, 4 * n);
for (let i = 0; i < n; i++, pos += 4)
view.setFloat32(pos, x[i], le);
case Type.F32_ARRAY:
acc = setArray("setFloat32", 4, acc, x, le);
break;
}
case Type.F64:
acc = ensure(acc, 8);
view.setFloat64(pos, <number>x, le);
pos += 8;
break;
case Type.F64_ARRAY: {
x = <ArrayLike<number>>x;
const n = x.length;
acc = ensure(acc, 8 * n);
for (let i = 0; i < n; i++, pos += 8)
view.setFloat64(pos, x[i], le);
case Type.F64_ARRAY:
acc = setArray("setFloat64", 8, acc, x, le);
break;
}
case Type.STR: {
let utf = [...utf8Encode(<string>x)];
acc = ensure(acc, utf.length);
Expand Down
25 changes: 12 additions & 13 deletions packages/transducers-binary/src/utf8.ts
Original file line number Diff line number Diff line change
Expand Up @@ -201,19 +201,18 @@ export const utf8Length = (str: string) => {
if (u >= 0xd800 && u <= 0xdfff) {
u = (0x10000 + ((u & 0x3ff) << 10)) | (str.charCodeAt(++i) & 0x3ff);
}
if (u <= 0x7f) {
len++;
} else if (u <= 0x7ff) {
len += 2;
} else if (u <= 0xffff) {
len += 3;
} else if (u <= 0x1fffff) {
len += 4;
} else if (u <= 0x3ffffff) {
len += 5;
} else {
len += 6;
}
len +=
u <= 0x7f
? 1
: u <= 0x7ff
? 2
: u <= 0xffff
? 3
: u <= 0x1fffff
? 4
: u <= 0x3ffffff
? 5
: 6;
}
return len;
};

0 comments on commit 021fd6f

Please sign in to comment.