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 elganiny.haytham@gmail.com
COPYRIGHT AND LICENSE
Copyright 2019 Haytham Elganiny
This library is free software; you can redistribute it and/or modify it under the Artistic License 2.0.