txt: ## dist_cpan-HYTHM-Grid.md
  # 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](mailto: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.
  