aboutsummaryrefslogtreecommitdiff
path: root/pw_hdlc/ts/util.ts
blob: 34cb6a0724f9e1c3a7dcfc318ec8f9d32754d5d0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
// Copyright 2021 The Pigweed Authors
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.

/** Convenience methods for working with Uint8Array buffers */

/**
 * Returns a new array where all instances of target have been replaced by the
 * provided substitue.
 */
export function replace(
  data: Uint8Array,
  target: number,
  substitute: number[]
): Uint8Array {
  const result: number[] = [];
  data.forEach(value => {
    if (value === target) {
      result.push(...substitute);
    } else {
      result.push(value);
    }
  });
  return Uint8Array.from(result);
}

/** Flattens the provided list of Uint8Arrays into a single array. */
export function concatenate(...byteList: Uint8Array[]): Uint8Array {
  const length = byteList.reduce(
    (accumulator, bytes) => accumulator + bytes.length,
    0
  );
  const result = new Uint8Array(length);
  let offset = 0;
  byteList.forEach(value => {
    result.set(value, offset);
    offset += value.length;
  });
  return result;
}