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