Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

@rbxts/sift

csqrl868MIT0.0.11TypeScript support: included

Immutable data library for Luau

array, dictionary, immutable, roblox-ts, roblox, table, luau, lua

readme

Sift

Source code NPM Package Itch.io store page Roblox library

Latest GitHub version Latest Wally version Latest NPM version

Immutable data library for Luau and roblox-ts.

Heavily based on @freddylist's Llama library, which is no longer maintained.

Documentation

Documentation, powered by moonwave, is available at https://csqrl.github.io/sift.

v0.x

For the time being, releases will remain at v0.x, and Sift should not be considered 100% stable. This is in line with the Semantic Versioning 2.0.0 specification.

  • Breaking changes may occur when the minor version is incremented.
  • The patch version will be incremented for additions, non-breaking changes, and bug fixes.

This will remain the same until v1.x.

Quick Start

Sift is available from Wally, Itch.io, the Roblox Library, and GitHub releases.

While Sift is 100% free and open source, if you feel like sponsoring, Sift is also available on Itch.io.

Wally

Wally is a CLI package manager (much like NPM, Yarn or Cargo) for Roblox by @UpliftGames. Find out more at https://github.com/upliftgames/wally.

# wally.toml

[dependencies]
Sift = "csqrl/sift@0.0.X" # Replace with current version number
$ wally install

TypeScript

v0.0.1 of Sift includes TypeScript typings. This means Sift is now compatible with roblox-ts. Refer to the Luau docs for API details.

$ npm install @rbxts/sift
// example.ts
import Sift from "@rbxts/sift"

Sift.Dictionary.merge({ a: 1, c: 2 }, { b: 3, c: Sift.None }) // { a: 1, b: 3 }

Manual Installation

Grab a copy from the Roblox Library or GitHub releases, and drop it into Studio. The Sift model file can be synced in using Rojo.

What's Changed?

As per the recommendations in Llama's README, the following changes have been made:

  • Sift utilises native Luau types. Llama used @osyrisrblx/t for type checking, which meant that types were only checked at runtime.
    • Sift will not check types at runtime. If you're using the library wrong, you'll get errors at runtime anyway!
  • Organised tests. *.spec files are now alongside their source files, making it easier to locate them.
  • Documentation is now generated using @upliftgames' moonwave (Docusaurus). This makes it quick and easy to add new documentation, and provides a pleasant experience for the user.
  • Built-in TypeScript typings.

What's New?

Arrays (Lists)

  • at: Get an element at a specific index (negative indices are supported).
  • difference: Returns an array of values that are in the first array, but not in the other arrays.
  • differenceSymmetric: Returns an array of values that are in the first array, but not in the other arrays, and vice versa.
  • freeze: Freeze an array.
  • freezeDeep: Freeze an array and all nested arrays.
  • is: Check if the passed value is an array.
  • shuffle: Shuffle the elements of an array to a random order.

Dictionaries

  • entries: Get the entries of a dictionary as an array of key-value pairs.
  • freeze: Freeze a dictionary.
  • freezeDeep: Freeze a dictionary and all nested dictionaries.
  • fromEntries: Create a dictionary from an array of key-value pairs.

Sets

  • count: Get the number of elements in a set.
  • difference: Returns a set of values that are in the first set, but not in the other sets.
  • differenceSymmetric: Returns a set of values that are in the first set, but not in the other sets, and vice versa.

changelog

Changelog

[0.0.6]

Added

  • Dictionary.withKeys by @sasial-dev to restrict what keys can appear in a given dictionary.

[0.0.5]

Added

  • Array.difference and Array.differenceSymmetric to find the difference between two or more arrays.
  • Set.difference and Set.differenceSymmetric to find the difference between two or more sets.

Fixed

  • Typings for Array.concat, which previously returned T[][] instead of T[].

[0.0.4]

  • Implemented Array.is: (value: any) -> boolean to check if a given value is an array.

[0.0.3]

Changed

  • If update is called with a key that doesn't exist in the specified dictionary, the key's value is set to the key itself. Fix by @reselim in PR #7.
  • Added aftman.toml and switched GitHub workflows over to use aftman.

[0.0.2]

Changed

  • Fixed a bug where Array.concat(Deep), Dictionary.merge(Deep) and Set.merge would not accept holes (nil values) in their arguments. This would cause the function to stop processing further arguments once it found a nil value.
  • Fixed a bug where Array.insert would not insert the element at the correct index. An index of 0 will now insert the element at the end of the array. length+1 will also insert the element at the end of the array. length+2 (or greater) will be ignored, and the original array will be returned.
  • Bumped tooling versions:
    • rojo to v7.1.1
    • stylua to v0.13.1
    • selene to v0.17.0

[0.0.1]

Added

  • Basic TypeScript (roblox-ts) support (no tsdoc yet)! 🎉
  • Implemented isEmpty
  • Added typings to equalObjects
  • Added aliases for Array.concat, Array.concatDeep, Array.push, Array.unshift, Array.find, Array.includes, Dictionary.join, Dictionary.joinDeep, Set.fromArray, Set.merge, Set.delete
  • Added doc pages for installation and usage samples

Changed

  • Exposed isEmpty and equalObjects from the root module
  • Improved typings for methods accepting predictes
  • Updated documentation for some methods
  • Fixed Dictionary.flatten being shown in the Array docs (wrong @within tag)

[0.0.0]

Initial development version.