Set Operations
Compute intersections, differences, and unions on lists, strings, and objects. Polymorphic operations that work seamlessly across different data types.
Polymorphic Design
The same operations work on Lists, Strings, and Objects. ARO automatically applies the appropriate comparison logic for each type.
Operations Overview
| Operation | Description | Syntax |
|---|---|---|
intersect |
Elements present in both A and B | Compute the <result: intersect> from <a> with <b>. |
difference |
Elements in A but not in B | Compute the <result: difference> from <a> with <b>. |
union |
All unique elements from both | Compute the <result: union> from <a> with <b>. |
List Operations
The most common use case. Find common elements, differences, or combine lists:
Create the <list-a> with [2, 3, 5].
Create the <list-b> with [1, 2, 3, 4].
(* Find elements in both lists *)
Compute the <common: intersect> from <list-a> with <list-b>.
(* Result: [2, 3] *)
(* Find elements in A not in B *)
Compute the <only-in-a: difference> from <list-a> with <list-b>.
(* Result: [5] *)
(* Combine all unique elements *)
Compute the <all: union> from <list-a> with <list-b>.
(* Result: [2, 3, 5, 1, 4] *)
Multiset Semantics
When lists contain duplicates, intersect preserves duplicates up to the minimum count in either list:
Create the <a> with [1, 2, 2, 3].
Create the <b> with [2, 2, 2, 4].
Compute the <common: intersect> from <a> with <b>.
(* Result: [2, 2] - two 2s appear in both *)
String Operations
Set operations work at the character level for strings:
(* Find common characters *)
Compute the <shared: intersect> from "hello" with "bello".
(* Result: "ello" *)
(* Find unique characters in first string *)
Compute the <unique: difference> from "hello" with "bello".
(* Result: "h" *)
(* All unique characters *)
Compute the <combined: union> from "hello" with "bello".
(* Result: "hellob" *)
Object Operations (Deep Comparison)
For objects, set operations perform deep recursive comparison. Only key-value pairs that match exactly are included in intersections:
Create the <obj-a> with {
name: "Alice",
age: 30,
address: { city: "NYC", zip: "10001" }
}.
Create the <obj-b> with {
name: "Alice",
age: 31,
address: { city: "NYC", state: "NY" }
}.
(* Find matching key-value pairs *)
Compute the <common: intersect> from <obj-a> with <obj-b>.
(* Result: { name: "Alice", address: { city: "NYC" } } *)
(* Find differences *)
Compute the <diff: difference> from <obj-a> with <obj-b>.
(* Result: { age: 30, address: { zip: "10001" } } *)
Type Behavior Summary
| Operation | Lists | Strings | Objects |
|---|---|---|---|
intersect |
Elements in both (multiset) | Chars in both (order preserved) | Keys with matching values (recursive) |
difference |
In A, not in B | Chars in A, not in B | Keys/values in A, not matching B |
union |
A preserved + unique from B | A preserved + unique from B | Merge keys (A wins conflicts) |
Related: Filter with not in
The Filter action also supports set membership testing with in and not in operators.
These accept either CSV strings or array variables:
(* Create an exclusion list *)
Create the <exclude-statuses> with ["cancelled", "refunded"].
(* Filter using array variable *)
Filter the <active-orders> from the <orders>
where <status> not in <exclude-statuses>.
(* Or use CSV string syntax *)
Filter the <pending> from the <orders>
where <status> in "pending,processing".
Complete Example
Here's a practical example comparing two product catalogs:
(Catalog Comparison: Inventory) {
(* Two product ID lists *)
Create the <warehouse-a> with ["SKU-001", "SKU-002", "SKU-005"].
Create the <warehouse-b> with ["SKU-001", "SKU-003", "SKU-004"].
(* Find products in both warehouses *)
Compute the <in-both: intersect> from <warehouse-a> with <warehouse-b>.
(* Find products only in warehouse A *)
Compute the <only-in-a: difference> from <warehouse-a> with <warehouse-b>.
(* Find products only in warehouse B *)
Compute the <only-in-b: difference> from <warehouse-b> with <warehouse-a>.
(* Get complete inventory *)
Compute the <all-products: union> from <warehouse-a> with <warehouse-b>.
Return an <OK: status> with {
in-both: <in-both>,
exclusive-a: <only-in-a>,
exclusive-b: <only-in-b>,
total-inventory: <all-products>
}.
}
Learn More
See the full set operations specification in ARO-0042: Set Operations.