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.