{- |
   Facelet representation

   Facelets faces are unfolded and laid out like this:

   @
       U
     L F R B
       D
   @

   Faces (or colors) are ordered @U, L, F, R, B, D@.

   A Rubik's cube is a permutation of facelets numbered as follows:

   >            0  1  2
   >            3  4  5
   >            6  7  8
   >
   >  9 10 11  18 19 20  27 28 29  36 37 38
   > 12 13 14  21 22 23  30 31 32  39 40 41
   > 15 16 17  24 25 26  33 34 35  42 43 44
   >
   >           45 46 47
   >           48 49 50
   >           51 52 53

-}

module Rubik.Cube.Facelet (
  -- * Facelet permutation
  numFacelets,
  Facelets,
  facelets,
  fromFacelets,

  -- * Colors
  Color,
  colorOf,
  colorChar,

  -- * Color list
  ColorFacelets,
  colorFacelets,
  fromColorFacelets,
  colorFaceletsOf,

  -- * List conversions
  fromFacelets',
  facelets',
  fromColorFacelets',
  colorFacelets',
  colorFacelets'',

  -- * Pretty conversion
  stringOfFacelets,
  stringOfColorFacelets,
  stringOfColorFacelets',

  -- * Facelets corresponding to each cubie

  -- | The first letter in the name of a cubie is
  -- the color of its reference facelet
  -- (illustrated at @http://kociemba.org/math/cubielevel.htm@).
  --
  -- Corner colors are given in clockwise order.
  --
  -- Corners are lexicographically ordered
  -- (@U>L>F>R>B>D@).
  --
  -- Edges are gathered by horizontal slices (@U, D, UD@).

  -- ** Centers
  centerFacelets,

  -- ** Corners
  cornerFacelets,
  ulb, ufl, urf, ubr, dlf, dfr, drb, dbl,

  -- ** Edges
  edgeFacelets,
  ul, uf, ur, ub, dl, df, dr, db, fl, fr, bl, br
  ) where

import Rubik.Cube.Facelet.Internal