Early preview: syntax, standard library APIs, and tooling may change.

Core DataSets

Sets

Set[T] stores unique values and makes membership explicit.

Creating a Set

Set[T] tracks unique elements. Adding an existing value is a no-op.

import:
	set: set


func main(args: List[String]) -> Void:
	seen: Set[String] = set()
		.add("Ada")
		.add("Ada")
-- seen.length() == 1
-- seen.contains("Ada") == True

Membership

contains tests whether a value is present.

import:
	set: set


func main(args: List[String]) -> Void:
	seen: Set[String] = set().add("Ada")

	-- seen.contains("Grace") == False
	if seen.contains("Ada"):
		print("already seen") -- prints: already seen

Deduplication

Build a set while reading values when uniqueness is the point of the data structure.

import:
	set: set


pure func unique_words(words: List[String]) -> Set[String]:
	var result: Set[String] = set()
	for word in words:
		result = result.add(word)
	result


func main(args: List[String]) -> Void:
	unique: Set[String] = unique_words("one two one".words())
-- unique.length() == 2
-- unique.contains("one") == True
-- unique.contains("three") == False

Set Algebra

combine, intersect, difference, and symmetric_difference model common set operations.

import:
	set: set


func main(args: List[String]) -> Void:
	readers: Set[String] = set()
		.add("read")
		.add("write")

	writers: Set[String] = set()
		.add("write")
		.add("deploy")

	shared: Set[String] = readers.intersect(writers)

	either: Set[String] = readers.combine(writers)
-- shared.to_list().sort().join(", ") == "write"
-- either.to_list().sort().join(", ") == "deploy, read, write"

Back To Lists

Convert a set to a list when you need list methods such as sort or join.

import:
	set: set


func main(args: List[String]) -> Void:
	seen: Set[String] = set()
		.add("Grace")
		.add("Ada")

	names: List[String] = seen
		.to_list()
		.sort()
-- names.join(", ") == "Ada, Grace"

Example

unique-words.brp
import:
	set: set


pure func unique_words(words: List[String]) -> Set[String]:
	var unique: Set[String] = set()
	for word in words:
		unique = unique.add(word)
	unique


func main(args: List[String]) -> Void:
	unique: Set[String] = unique_words("one two one".words())
	names: List[String] = unique
		.to_list()
		.sort()

	print(unique.length()) -- prints: 2
	print(unique.contains("one")) -- prints: True
	print(names.join(", ")) -- prints: one, two

Try it

terminal
blorp run examples/docs/core-data/sets/unique-words.brp