bravo/oset

This module provides functions to work with OSets

Types

An ordered set. Keys may only occur once per table, and objects are ordered (this comes at a performance cost).

In order for a lookup match to occur, entries must coerce into the same value. Two values may match even if they have different types.

pub opaque type OSet(t)

Functions

pub fn delete(oset: OSet(a)) -> Bool

Deletes a OSet.

Table lifetime is static, and memory is only freed when the owner process is killed! Don’t forget to call this function!

pub fn delete_all_objects(oset: OSet(a)) -> Nil

Deletes all objects in the OSet. This is atomic and isolated.

pub fn delete_key(oset: OSet(a), key: b) -> Nil

Deletes the object addressed by key, if it exists. If it doesn’t, this does nothing.

pub fn delete_object(oset: OSet(a), object: a) -> Nil

Deletes a specific object in the OSet. This is more useful in Bags and DBags.

pub fn file2tab(
  filename: String,
  verify: Bool,
  decoder: fn(Dynamic) -> Result(a, b),
) -> Option(OSet(a))

Creates a OSet from file filename that was previously created by tab2file.

For type safety reasons, a dynamic decoder must be provided, and the decoder must not fail for all objects in the table.

If the flag verify is set, then checks are performed to ensure the data is correct. This can be slow if tab2file was ran with md5sum enabled.

pub fn insert(oset: OSet(a), objects: List(a)) -> Bool

Inserts a list of tuples into a OSet.

Returns a Bool representing if the inserting succeeded.

  • If True, all objects in the list were inserted.
  • If False, none of the objects in the list were inserted. This may occur if the keypos of the OSet is greater than the object tuple size.

If an object with the same key already exists, then the old object will be overwritten with the new one.

pub fn lookup(oset: OSet(a), key: b) -> Option(a)

Gets an object from a OSet.

Returns an Option containing the object, if it exists.

pub fn new(
  name: String,
  keypos: Int,
  access: Access,
) -> Result(OSet(a), Option(ErlangError))

Creates a new ETS table configured as an ordered set: keys may only occur once per table, and objects are ordered (this comes at a performance cost).

name: An atom representing the name of the OSet. There may only be one ETS table associated with an atom. keypos: The index (1-indexed) that represents the key position of the object. This function fails if this is less than 1. access: Determines how visible the table is to other processes.

  • Public: Any process can read or write to the OSet.
  • Protected: Any process can read the OSet. Only the owner process can write to it.
  • Private: Only the parent process can read or write to the OSet.

Returns a result of the created OSet, which can be used by other functions in this module. If this function errors with None, then you likely put in an illegal keypos value. Otherwise, something went wrong in the FFI layer and an error occured in Erlang land.

pub fn tab2file(
  oset: OSet(a),
  filename: String,
  object_count: Bool,
  md5sum: Bool,
  sync: Bool,
) -> Bool

Saves a OSet as file filename that can later be read back into memory using file2tab.

There are three configuration flags with this function:

  • object_count: Stores the number of objects in the table in the footer. This can detect truncation.
  • md5sum: Stores a md5 checksum of the table and its objects. This can detect even single bitflips, but is computationally expensive.
  • sync: Blocks the process until the file has been successfully written.
pub fn tab2list(oset: OSet(a)) -> List(a)

Returns a list containing all of the objects in the OSet.

The list returned is ordered.

Search Document