NAME
Games::Go::Cinderblock::NodeSet
SYNOPSIS
my $rulemap = Games::Go::Cinderblock::Rulemap::Rect->new
( h => 19, w => 19 );
#initialize two empty nodesets
my $ns1 = $rulemap->nodeset;
my $ns2 = $ns1->copy;
#add two opposite corners.
$ns1->add([0,0], [18,18]);
# add 4 nodes to $ns2, each adjacent to the 2 nodes in $ns1
$ns2->add($ns1->adjacent);
# let ns2 have the original 2 corners.
$ns2->add($ns1);
# split ns2 into its 2 connected subsets
my @foo = $ns2->disjoint_split;
# compare equality
my $false = $ns1 == $ns2;
DESCRIPTION
A set of nodes :|
NodeSets are typically initiated with $rulemap->nodeset(@nodes)
. NodeSets may be empty. Nodesets are independant of State, but heavily dependant on Rulemap.
insertion, lookup, removal of a single node is O(1). Nodesets are mutable, but union & intersect do not affect the invocant. Nodes are topology-implementation-dependent. In ::Rect instances, nodes are defined as a [$row,$col]
array ref. In future instances, a node may be defined as a number, with an entry in an adjacency matrix.
Set operations unclude union, intersect, ==
, count, add, remove, copy, has_node, disjoint_split
METHODS
count
Returns the number of nodes in the nodeset.
add
add
& remove
each may take either a nodeset or a list of nodes
remove
has_node
$set->add([3,3])
my $true = $set->has_node([3,3])
$set->remove([3,3])
my $false = $set->has_node([3,3])
copy
union
my $result = $set1->union($set2)
Return the set of nodes in either the invocant or operand.
intersect
my $result = $set1->intersect($set2)
Return the set of nodes in both invocant and operand.
==, !=
Compare two sets. Returns true or false.
adjacent
Returns a nodeset of nodes adjacent to the nodes of the invocant. The result excludes any nodes of the invocant.
disjoint_split
Return an arrayref of disconnected regions. Use this with Games::Go::Cinderblock::State's grep functionality to uncover distinct, disconnected regions of a particular attribute (color, etc.)