bravo/oset
This module provides functions to work with OSet
s
Types
An ordered set. Keys may only occur once per table, and keys are ordered (this comes at a performance cost).
The specific order of keys is based on the Erlang documentation.
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(with 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(with oset: OSet(a)) -> Nil
Deletes all objects in the OSet
. This is atomic and isolated.
pub fn delete_key(with oset: OSet(a), at key: b) -> Nil
Deletes the object addressed by key
, if it exists. If it doesn’t, this does nothing.
pub fn delete_object(with oset: OSet(a), target object: a) -> Nil
Deletes a specific object in the OSet
. This is more useful in Bag
s and DBag
s.
pub fn file2tab(
from filename: String,
verify verify: Bool,
using decoder: fn(Dynamic) -> Result(a, b),
) -> Result(OSet(a), BravoError)
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.
Size-1 tuples are handled uniquely internally and are treated as non-tuples when saved to disk, so you must decode the non-tuple version of the type.
Can have error types DecodeFailure
and ErlangError
.
pub fn first(with oset: OSet(a)) -> Option(b)
Returns the first key (not the object!) in the table, if it exists.
OSet
s are ordered as per the Erlang documentation.
pub fn insert(
with oset: OSet(a),
insert 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 thekeypos
of theOSet
is greater than the object tuple size or if the input list is empty.
If an object with the same key already exists, then the old object will be overwritten with the new one.
pub fn insert_new(
with oset: OSet(a),
insert objects: List(a),
) -> Bool
Inserts a list of tuples into a OSet
. Unlike insert
, this cannot overwrite objects and will return false if it tries to do so.
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 thekeypos
of theOSet
is greater than the object tuple size or if the input list is empty.
pub fn last(with oset: OSet(a)) -> Option(b)
Returns the last key (not the object!) in the table, if it exists.
OSet
s are ordered as per the Erlang documentation.
pub fn lookup(with oset: OSet(a), at key: b) -> Option(a)
Gets an object from a OSet
.
Returns an Option
containing the object, if it exists.
pub fn member(with oset: OSet(a), at key: b) -> Bool
Returns whether a OSet
contains an object at key
.
pub fn new(
name name: String,
keypos keypos: Int,
access access: Access,
) -> Result(OSet(a), BravoError)
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 theOSet
.Protected
: Any process can read theOSet
. Only the owner process can write to it.Private
: Only the parent process can read or write to theOSet
.
Returns a result of the created OSet
, which can be used by other functions in this module.
Can have error types ErlangError
and NonPositiveKeypos
.
pub fn next(with oset: OSet(a), from key: b) -> Option(b)
Given a key, returns the next key (not the object!) after it in the table, if it exists.
OSet
s are ordered as per the Erlang documentation.
pub fn prev(with oset: OSet(a), from key: b) -> Option(b)
Given a key, returns the previous key (not the object!) before it in the table, if it exists.
OSet
s are ordered as per the Erlang documentation.
pub fn tab2file(
with oset: OSet(a),
to filename: String,
object_count object_count: Bool,
md5sum md5sum: Bool,
sync sync: Bool,
) -> Result(Nil, BravoError)
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.
Can have error type ErlangError
.
pub fn tab2list(with oset: OSet(a)) -> List(a)
Returns a list containing all of the objects in the OSet
.
The list returned is ordered.