Yzz
is a domain model of Ted Nelson's Zz structures.
The following usage example takes use of y_support/name_magic
features.
Please install y_support
gem before trying yzz
.
require 'yzz'
require 'y_support/name_magic'
# Let's make a new class and imbue it with Yzz quality.
#
class Cell
include Yzz, NameMagic
def to_s
name ? name.to_s : "#<Cell: #{connections.size} conn.>"
end
end
# Let's now create 6 new ZZ cells.
A1, A2, A3, B1, B2, B3 = 6.times.map { Cell.new }
# And let's connect them along :x and :y dimensions:
A1.along( :x ) >> A2 >> A3
B1.along( :x ) >> B2 >> B3
A1.along( :y ) >> B1
A2.along( :y ) >> B2
A3.along( :y ) >> B3
# The resulting ZZ structure looks like this:
#
# a1 --> a2 --> a3
# | | |
# | | |
# v v v
# b1 --> b2 --> b3
#
# It looks a bit like a small spreadsheet 3×2.
# We can now explore this structure:
A1.neighbors # returns all the neighbors of A1
#=> [A2, B1]
A1.towards A2 # returns all the sides of A1 facing A2
# (note that A1 and A2 can be neighbors along more than one dimension)
#=> [#<Yzz::Side: A1 along x, posward>]
A1.tw A2 # instead of "towards", we can just say "tw"
#=> x->
A1.tw B1
#=> y->
# Of course, more complicated Zz structures can be created. See the online
# presentation at xanadu.com for more ( http://xanadu.com/zigzag/ ). For
# a small example here, let's create 2 diagonal connections:
A1.along( :diagonal ) >> B2
A2.along( :diagonal ) >> B3
A1.tw B2
#=> diagonal->
A1.neighbors
#=> [A2, B1, B2]
Again, the concern of yzz
gem is to only provide the structure itself,
rather than a comprehensive interface for interaction, visualization and
other possible tasks. For these, you may check y_nelson
gem.
- Fork it
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Add some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create new Pull Request