NAME ==== Grid - Role for Arrays. SYNOPSIS ======== use Grid; my @grid = < a b c d e f g h i j k l m n o p q r s t u v w x >; @grid does Grid[:4columns]; DESCRIPTION =========== Grid is a `Role` that transforms an `Array` to `Array+{Grid}`, And provides additional methods (e.g flip, rotate, transpose). To flip a `Grid` horizontaly or vertically: @grid.flip: :horizontal @grid.flip: :vertical It is also possible to apply methods to a subgrid of `Grid`, provided a valid subgrid indices: my @indices = 9, 10, 13, 14; @grid.flip: :vertical(@indices); # or my @vertical = 9, 10, 13, 14; @grid.flip: :@vertical;` `Grid` preserves the overall shape, So some operations require `is-square` to be `True` for `Grid` (or Subgrid), otherwise fails and returns `self`. EXAMPLES ======== ### grid
@grid.grid;
a b c d
e f g h
i j k l
m n o p
q r s t
u v w x
### flip
a b c d d c b a
e f g h h g f e
i j k l :horizontal l k j i
m n o p -----------------> p o n m
q r s t t s r q
u v w x x w v u
a b c d u v w x
e f g h q r s t
i j k l :vertical m n o p
m n o p -----------------> i j k l
q r s t e f g h
u v w x a b c d
a b c d a b c d
e f g h e i m q
i j k l :@diagonal f j n r
m n o p -----------------> g k o s
q r s t subgrid [ 4 ... 19 ] h l p t
u v w x u v w x
a b c d a b c d
e f g h t p l h
i j k l :@antidiagonal s o k g
m n o p -----------------> r n j f
q r s t [ 4 ... 19 ] q m i e
u v w x u v w x
a b c d a b c d
e f g h e f g h
i j k l :diagonal i j k l
m n o p -----------------> m n o p
q r s t q r s t
u v w x u v w x
# fails becuase Grid.is-square === False
### rotate
a b c d
e f g h u q m i e a
i j k l :clockwise v r n j f b
m n o p -----------------> w s o k g c
q r s t x t p l h d
u v w x
a b c d a b c d
e f g h e f g h
i j k l :@anticlockwise i k o l
m n o p -----------------> m j n p
q r s t [ 9, 10, 13, 14 ] q r s t
u v w x u v w x
a b c d d a b c
e f g h h e f g
i j k l :right l i j k
m n o p -----------------> p m n o
q r s t t q r s
u v w x x u v w
a b c d c d a b
e f g h g h e f
i j k l :2left k l i j
m n o p -----------------> o p m n
q r s t s t q r
u v w x w x u v
a b c d m n o p
e f g h q r s t
i j k l :3down u v w x
m n o p -----------------> a b c d
q r s t e f g h
u v w x i j k l
a b c d e f g h
e f g h i j k l
i j k l :7up m n o p
m n o p -----------------> q r s t
q r s t u v w x
u v w x a b c d
### transpose
a b c d
e f g h a e i m q u
i j k l b f j n r v
m n o p -----------------> c g k o s w
q r s t d h l p t x
u v w x
a b c d a b c d
e f g h e f g h
i j k l :@indices i j n l
m n o p -----------------> m k o p
q r s t [ 9, 10, 13, 14 ] q r s t
u v w x u v w x
a b c d a b c d
e f g h e f g h
i j k l :@indices i j k l
m n o p ----------------> m n o p
q r s t [ 5, 6, 9, 10, 13, 14 ] q r s t
u v w x u v w x
# fails becuase Subgrid.is-square === False
### append
a b c d a b c d
e f g h e f g h
i j k l :@rows i j k l
m n o p -----------------> m n o p
q r s t [ 0, 1, 2, 3 ] q r s t
u v w x u v w x
0 1 2 3
a b c d a b c d 0
e f g h e f g h 1
i j k l :@columns i j k l 2
m n o p -----------------> m n o p 3
q r s t [ 0, 1, 2, 3, 4, 5 ] q r s t 4
u v w x u v w x 5
### prepend
a b c d 0 1 2 3
e f g h a b c d
i j k l :@rows e f g h
m n o p -----------------> i j k l
q r s t [ 0, 1, 2, 3 ] m n o p
u v w x q r s t
u v w x
a b c d 0 a b c d
e f g h 1 e f g h
i j k l :@columns 2 i j k l
m n o p -----------------> 3 m n o p
q r s t [ 0, 1, 2, 3, 4, 5 ] 4 q r s t
u v w x 5 u v w x
### pop
a b c d
e f g h a b c d
i j k l :2rows e f g h
m n o p -----------------> i j k l
q r s t m n o p
u v w x
a b c d a b c
e f g h e f g
i j k l :1columns i j k
m n o p -----------------> m n o
q r s t q r s
u v w x u v w
### shift
a b c d
e f g h i j k l
i j k l :2rows m n o p
m n o p -----------------> q r s t
q r s t u v w x
u v w x
a b c d d
e f g h h
i j k l :3columns l
m n o p -----------------> p
q r s t t
u v w x x
METHODS
=======
### grid
method grid { ... }
Prints a `:$!columns` `Grid`.
### columns
method columns { ... }
Returns `Grid`'s columns count.
### rows
method columns { ... }
Returns `Grid`'s rows count.
### check
multi method check ( :@rows! --> Bool:D ) { ... }
Check if Rows can fit in `Grid`.
multi method check ( :@columns! --> Bool:D ) { ... }
Check if Columns can fit in `Grid`.
### reshape
method reshape ( Grid:D: Int :$columns! where * > 0 --> Grid:D ) { ... }
### flip
multi method flip ( Grid:D: Int:D :$horizontal! --> Grid:D ) { ... }
Horizontal Flip.
multi method flip ( Grid:D: Int:D :$vertical! --> Grid:D ) { ... }
Verical Flip.
multi method flip ( Grid:D: Int:D :$diagonal! --> Grid:D ) { ... }
Diagonal Flip.
multi method flip ( Grid:D: Int:D :$antidiagonal! --> Grid:D ) { ... }
Anti-Diagonal Flip.
multi method flip ( Grid:D: :@horizontal! --> Grid:D ) { ... }
Horizontal Flip (Subgrid).
multi method flip ( Grid:D: :@vertical! --> Grid:D ) { ... }
Vertical Flip (Subgrid).
multi method flip ( Grid:D: :@diagonal! --> Grid:D ) { ... }
Diagonal Flip (Subgrid).
multi method flip ( Grid:D: :@antidiagonal! --> Grid:D ) { ... }
Anti-Diagonal Flip (Subgrid).
### rotate
multi method rotate ( Grid:D: Int:D :$left! --> Grid:D ) { ... }
Left Rotate. (Columns)
multi method rotate ( Grid:D: Int:D :$right! --> Grid:D ) { ... }
Right Rotate. (Columns)
multi method rotate ( Grid:D: Int:D :$up! --> Grid:D ) { ... }
Up Rotate. (Rows)
multi method rotate ( Grid:D: Int:D :$down! --> Grid:D ) { ... }
Up Rotate. (Rows)
multi method rotate ( Grid:D: Int:D :$clockwise! --> Grid:D ) { ... }
Clockwise Rotate.
multi method rotate ( Grid:D: Int:D :$anticlockwise! --> Grid:D ) { ... }
Anti-Clockwise Rotate.
multi method rotate ( Grid:D: :@clockwise! --> Grid:D ) { ... }
Clockwise Rotate (Subgrid)
multi method rotate ( Grid:D: :@anticlockwise! --> Grid:D ) { ... }
Clockwise Rotate (Subgrid)
### transpose
multi method transpose ( Grid:D: --> Grid:D ) { ... }
Transpose.
multi method transpose ( Grid:D: :@indices! --> Grid:D ) { ... }
Transpose (Subgrid)
### append
multi method append ( Grid:D: :@rows! --> Grid:D ) { ... }
Append Rows.
multi method append ( Grid:D: :@columns! --> Grid:D ) { ... }
Append Columns.
### Prepend
multi method prepend ( Grid:D: :@rows! --> Grid:D ) {
Prepend Rows.
multi method prepend ( Grid:D: :@columns! --> Grid:D ) { ... }
Prepend Columns.
### push
multi method push ( Grid:D: :@rows! --> Grid:D ) { ... }
Push Rows.
multi method push ( Grid:D: :@columns! --> Grid:D ) {
Push Columns.
### pop
multi method pop ( Grid:D: Int :$rows! --> Grid:D ) { ... }
Pop Rows.
multi method pop ( Grid:D: Int :$columns! --> Grid:D ) { ... }
Pop Columns.
### shift
multi method shift ( Grid:D: Int :$rows! --> Grid:D ) { ... }
Shift Rows.
multi method shift ( Grid:D: Int :$columns! --> Grid:D ) { ... }
Shift Columns.
### unshift
multi method unshift ( Grid:D: :@rows! --> Grid:D ) { ... }
Unshift Rows.
multi method unshift ( Grid:D: :@columns! --> Grid:D ) {
Unshift Columns.
### has-subgrid
method has-subgrid( :@indices!, :$square = False --> Bool:D ) { ... }
Returns `True` if `:@indices` is a subgrid of `Grid`, `False` otherwise.
### is-square
method is-square ( --> Bool:D ) { ... }
Returns `True` if `Grid` is a square, False otherwise.
AUTHOR
======
Haytham Elganiny