{-|
Module      : Data.Matrix.SymmetryOperationsSymbols.Symbol
Description : Symmetry Operation Symbols
Copyright   : (c) Jun Narumi, 2018-2020
License     : MIT
Maintainer  : narumij@gmail.com
Stability   : experimental
-}
module Data.Matrix.SymmetryOperationsSymbols.Symbol (
    Symbol(..)
  ) where

import Control.Monad


data Symbol
   = Id  --  '1'
   | T   --   t
   | Inv -- '-1'
   | M   --  'm'
   | A   --   a
   | B   --   b
   | C   --   c
   | D   --   d
   | G   --   g
   | N   --   n
   | R2  --  '2'
   | R3  --  '3'
   | R4  --  '4'
   | R6  --  '6'
   | RI3 -- '-3'
   | RI4 -- '-4'
   | RI6 -- '-6'
   deriving (Show,Eq)

instance Read Symbol where
  readsPrec _ = join . sequence readSymbols
    where
      readSymbols = [
        \n -> [ ( Id,st) | ("1",st) <- lex n ],
        \n -> [ (  T,st) | ("t",st) <- lex n ],
        \n -> [ (  M,st) | ("m",st) <- lex n ],
        \n -> [ (  A,st) | ("a",st) <- lex n ],
        \n -> [ (  B,st) | ("b",st) <- lex n ],
        \n -> [ (  C,st) | ("c",st) <- lex n ],
        \n -> [ (  D,st) | ("d",st) <- lex n ],
        \n -> [ (  G,st) | ("g",st) <- lex n ],
        \n -> [ (  N,st) | ("n",st) <- lex n ],
        \n -> [ ( R2,st) | ("2",st) <- lex n ],
        \n -> [ ( R3,st) | ("3",st) <- lex n ],
        \n -> [ ( R4,st) | ("4",st) <- lex n ],
        \n -> [ ( R6,st) | ("6",st) <- lex n ],
        \n -> [ (Inv,st) | ("-",nn) <- lex n, ("1",st) <- lex nn ],
        \n -> [ (RI3,st) | ("-",nn) <- lex n, ("3",st) <- lex nn ],
        \n -> [ (RI4,st) | ("-",nn) <- lex n, ("4",st) <- lex nn ],
        \n -> [ (RI6,st) | ("-",nn) <- lex n, ("6",st) <- lex nn ]
        ]

fromSymbol :: Symbol -> String
fromSymbol  Id =  "1"
fromSymbol   T =  "t"
fromSymbol Inv = "-1"
fromSymbol   M =  "m"
fromSymbol   A =  "a"
fromSymbol   B =  "b"
fromSymbol   C =  "c"
fromSymbol   D =  "d"
fromSymbol   G =  "g"
fromSymbol   N =  "n"
fromSymbol  R2 =  "2"
fromSymbol  R3 =  "3"
fromSymbol  R4 =  "4"
fromSymbol  R6 =  "6"
fromSymbol RI3 = "-3"
fromSymbol RI4 = "-4"
fromSymbol RI6 = "-6"