{"version":3,"file":"bitArray.cjs","sources":["../../src/bitArray.ts"],"sourcesContent":["/* eslint-disable no-bitwise */\nimport {\n  BaseSerializerOptions,\n  NotEnoughBytesError,\n  Serializer,\n} from '@metaplex-foundation/umi-serializers-core';\n\n/**\n * Defines the options for bitArray serializers.\n * @category Serializers\n */\nexport type BitArraySerializerOptions = BaseSerializerOptions & {\n  /**\n   * Whether to read the bits in reverse order.\n   * @defaultValue `false`\n   */\n  backward?: boolean;\n};\n\n/**\n * An array of boolean serializer that\n * converts booleans to bits and vice versa.\n *\n * @param size - The amount of bytes to use for the bit array.\n * @param options - A set of options for the serializer.\n * @category Serializers\n */\nexport const bitArray = (\n  size: number,\n  options: BitArraySerializerOptions | boolean = {}\n): Serializer<boolean[]> => {\n  const parsedOptions: BitArraySerializerOptions =\n    typeof options === 'boolean' ? { backward: options } : options;\n  const backward = parsedOptions.backward ?? false;\n  const backwardSuffix = backward ? '; backward' : '';\n  return {\n    description:\n      parsedOptions.description ?? `bitArray(${size}${backwardSuffix})`,\n    fixedSize: size,\n    maxSize: size,\n    serialize(value: boolean[]) {\n      const bytes: number[] = [];\n\n      for (let i = 0; i < size; i += 1) {\n        let byte = 0;\n        for (let j = 0; j < 8; j += 1) {\n          const feature = Number(value[i * 8 + j] ?? 0);\n          byte |= feature << (backward ? j : 7 - j);\n        }\n        if (backward) {\n          bytes.unshift(byte);\n        } else {\n          bytes.push(byte);\n        }\n      }\n\n      return new Uint8Array(bytes);\n    },\n    deserialize(bytes, offset = 0) {\n      const booleans: boolean[] = [];\n      let slice = bytes.slice(offset, offset + size);\n      slice = backward ? slice.reverse() : slice;\n      if (slice.length !== size) {\n        throw new NotEnoughBytesError('bitArray', size, slice.length);\n      }\n\n      slice.forEach((byte) => {\n        for (let i = 0; i < 8; i += 1) {\n          if (backward) {\n            booleans.push(Boolean(byte & 1));\n            byte >>= 1;\n          } else {\n            booleans.push(Boolean(byte & 0b1000_0000));\n            byte <<= 1;\n          }\n        }\n      });\n\n      return [booleans, offset + size];\n    },\n  };\n};\n"],"names":["bitArray","size","options","parsedOptions","backward","backwardSuffix","description","fixedSize","maxSize","serialize","value","bytes","i","byte","j","feature","Number","unshift","push","Uint8Array","deserialize","offset","booleans","slice","reverse","length","NotEnoughBytesError","forEach","Boolean"],"mappings":"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"}