npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@ascari/bitarray

v0.6.0

Published

A seamless implementation of a BitArray for Javascript

Downloads

1

Readme

Bit Array - A Javascript Data Type extension

A BitArray works like a regular Array object. In fact, anything you can do with Arrays index.Of lastIndexOf slice splice join reverse filter sort etc you can do with a BitArray instance. Keep in mind that the elements will always be a numeric 0 or a 1.

As it's still impossible to inherit from the Array object, to take advantage of the bracket syntax i.e. customArray[index], as explained in the article by perfectionkills:

Subclassing an array in Javascript has never been a trivial task. At least for a certain meaning of “subclassing an array”. Curiously, new edition of the language — ECMAScript 5 — still does not allow to fully subclass an array.

Direct property injection is used, as it is the only reliable choice.

Intallation

Browser

<script src="pathto/bitarray.js"></script>

Usage

All ES5 Array methods are supported

var buffer = new BitArray(1,1,0,0)
console.log(buffer[0], buffer[1], buffer[2], buffer[3]) // 1 1 0 0

buffer.push(1, 0, 1, 0, 1)
console.log(buffer) // [1,1,0,0,1,0,1,0,1]

buffer.push(1, 1, 1, 1, 1)
console.log(buffer) // [1,1,0,0,1,0,1,0,1,1,1,1,1,1]

buffer.length = 0 // []

buffer.push('A') // 65. characters are stored in 16 bits
console.log(buffer) // [0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1]

buffer.pop()
buffer.pop()
console.log(buffer) // [0,0,0,0,0,0,0,0,0,1,0,0,0,0]

buffer.unshift(1,1,1)
console.log(buffer) // [1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0]

// Lets go nuts
buffer.length = 0 // []

buffer.push(1,0,1,1,1, 'Hello World', 255, 0xFFFF, 0, true, false, 1, 0, 1, 0)
console.log(buffer) // See **Accepted Types**
			// [1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
			// 0,0,1,0,1,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,
			// 0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,
			// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,
			// 0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,
			// 0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,1,0,1,0,1,0]

NOTE Javasciript uses 16 bits for a single character from the most common characters defined by the UCS-2 standard a subset of UTF-16. All characters are treated as 16 bits. reference

Accepted Types

The Array equivalant methods defined by the BitArray, will resolve values in the following order:

typeof value === 'string' 
Treat each character as its 16 bit character code

typeof value === 'boolean'
Treat each value as either a 1 or a 0

typeof value === 'number'
	If number is a 0 or 1, it is treated as a single bit.
	else
		The number is treated as a ~64 bit number...
		almost 64bits, the number has to be less than 0xFFFFFFFFFFFFFBFF
		(18446744073709550000. instead of 18446744073709552000.)

When in doubt, be specific:

NOTICE Specifiers have not been implemented yet, they are in the kitchen, on their way out. Specifiers will become a postfix to common Array-equivalent methods, this is simply to enforce a particular type of input, since a Number, for example can be a single bit or 64 bits depending on it's value, this may cause conflift, hence the specifiers.

buffer.pushBit(1)         	 // 1 bit
buffer.pushBit(1, 0, 1)      // 3 bits
buffer.pushChar('A')         // 16 bits
buffer.pushString('Awesome') // (16 * `Awesome`.length) bits
buffer.pushNumber(1)         // 64 bits
buffer.pushUInt32(0xFFFF44)  // 32 bits

All The Array equivalant methods will have more specific counterparts where the type is explicit, e.g.

unshiftBit popBit spliceBit joinNumber forEachBit sliceNumber join32UInt indexOfString sliceBit spliceString joinChar findBit

Everything is treated as bits internally, so when using lastIndexOfString for example, the string being searched for will be converted to binary, and a binary search will be done. This is true for all iterating methods: indexOfChar forEachString findChar etc

The idea is to iterate the internal bits in a BitArray while treating them as bytes, words and even strings, depending on the postfix applied.

Specific Methods

Use any postfix on a method if you want to work on the internal bits as specific bit structure

BitArray.<method>[<postfix>]()

| postfix | bit size | alias | accepted types |----------|------------------|-----------------------------|------------------------------------| | Bit | 1 | Bits | number | Char | 16 | Character | string (only first character) | String | length * 16 | Str | string | Date | 64 | | instanceof Date | Number | 64 | 64Uint Qword QWORD | number (0 - 18446744073709550000) | UInt32 | 32 | Dword DWORD | number (0 - 4294967295) | UInt16 | 16 | Word WORD | number (0 - 65535) | UInt8 | 8 | Byte BYTE | number (0 - 255) | Array | length * 1 | | instanceof Array each element is a bit | BitArray | length * 1 | | BitArray.isBitArray()

Note When only a number is an accepted type, it can be a Numeric string as well as a boolean, as it will be casted into a number. When using a specifier, if the argument is not a supported type, it will throw

Static Methods

BitArray has the following static methods that allow you to create a new BitArray from different types:

Boolean BitArray.isBitArray(Object) Test if object is a BitArray

BitArray BitArray.fromNumber(Number) Convert a number into a 64 bit BitArray

BitArray BitArray.fromString(String) Convert a string into a BitArray

BitArray BitArray.fromArray(Array) Convert an array of 0s and 1s into a BitArray

BitArray BitArray.fromMixedArray(Array) Convert an array of mixed element types (and bit sizes), into a BitArray

BitArray BitArray.fromDate(Date) Convert a date into a 64 bit BitArray

BitArray BitArray.fromBoolean(Boolean) Convert a boolean into a 1 bit BitArray

Documentation

Documentation is generated with the very awesome yuidoc

make sure it's installed:

npm yuidoc -g

And run the following command in the root folder to create a folder called documentation

yuidoc

Testing

Testing is done with mocha, make sure it's installed:

npm i mocha -g

and run the tests found inside the test folder with

mocha

Todo

  • Include Specifiers and their alias
  • Conversion from and to types including Typed Arrays
  • Bit manipulation methods (rotr, xor, etc)
  • Node.js streaming
  • ES6 support (shims & implementation)
  • ES5 shims, in case they are ever needed

License

The MIT License