{-# LANGUAGE GeneralizedNewtypeDeriving #-}

module TuringMachine.Symbol (
    Symbol,
    symbol,
    numSymbol,
    blankSymbol,
  ) where

newtype Symbol = S { Symbol -> Int
numSymbol :: Int }
    deriving (Symbol -> Symbol -> Bool
(Symbol -> Symbol -> Bool)
-> (Symbol -> Symbol -> Bool) -> Eq Symbol
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Symbol -> Symbol -> Bool
$c/= :: Symbol -> Symbol -> Bool
== :: Symbol -> Symbol -> Bool
$c== :: Symbol -> Symbol -> Bool
Eq, Eq Symbol
Eq Symbol
-> (Symbol -> Symbol -> Ordering)
-> (Symbol -> Symbol -> Bool)
-> (Symbol -> Symbol -> Bool)
-> (Symbol -> Symbol -> Bool)
-> (Symbol -> Symbol -> Bool)
-> (Symbol -> Symbol -> Symbol)
-> (Symbol -> Symbol -> Symbol)
-> Ord Symbol
Symbol -> Symbol -> Bool
Symbol -> Symbol -> Ordering
Symbol -> Symbol -> Symbol
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Symbol -> Symbol -> Symbol
$cmin :: Symbol -> Symbol -> Symbol
max :: Symbol -> Symbol -> Symbol
$cmax :: Symbol -> Symbol -> Symbol
>= :: Symbol -> Symbol -> Bool
$c>= :: Symbol -> Symbol -> Bool
> :: Symbol -> Symbol -> Bool
$c> :: Symbol -> Symbol -> Bool
<= :: Symbol -> Symbol -> Bool
$c<= :: Symbol -> Symbol -> Bool
< :: Symbol -> Symbol -> Bool
$c< :: Symbol -> Symbol -> Bool
compare :: Symbol -> Symbol -> Ordering
$ccompare :: Symbol -> Symbol -> Ordering
$cp1Ord :: Eq Symbol
Ord, Integer -> Symbol
Symbol -> Symbol
Symbol -> Symbol -> Symbol
(Symbol -> Symbol -> Symbol)
-> (Symbol -> Symbol -> Symbol)
-> (Symbol -> Symbol -> Symbol)
-> (Symbol -> Symbol)
-> (Symbol -> Symbol)
-> (Symbol -> Symbol)
-> (Integer -> Symbol)
-> Num Symbol
forall a.
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (Integer -> a)
-> Num a
fromInteger :: Integer -> Symbol
$cfromInteger :: Integer -> Symbol
signum :: Symbol -> Symbol
$csignum :: Symbol -> Symbol
abs :: Symbol -> Symbol
$cabs :: Symbol -> Symbol
negate :: Symbol -> Symbol
$cnegate :: Symbol -> Symbol
* :: Symbol -> Symbol -> Symbol
$c* :: Symbol -> Symbol -> Symbol
- :: Symbol -> Symbol -> Symbol
$c- :: Symbol -> Symbol -> Symbol
+ :: Symbol -> Symbol -> Symbol
$c+ :: Symbol -> Symbol -> Symbol
Num, Int -> Symbol
Symbol -> Int
Symbol -> [Symbol]
Symbol -> Symbol
Symbol -> Symbol -> [Symbol]
Symbol -> Symbol -> Symbol -> [Symbol]
(Symbol -> Symbol)
-> (Symbol -> Symbol)
-> (Int -> Symbol)
-> (Symbol -> Int)
-> (Symbol -> [Symbol])
-> (Symbol -> Symbol -> [Symbol])
-> (Symbol -> Symbol -> [Symbol])
-> (Symbol -> Symbol -> Symbol -> [Symbol])
-> Enum Symbol
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: Symbol -> Symbol -> Symbol -> [Symbol]
$cenumFromThenTo :: Symbol -> Symbol -> Symbol -> [Symbol]
enumFromTo :: Symbol -> Symbol -> [Symbol]
$cenumFromTo :: Symbol -> Symbol -> [Symbol]
enumFromThen :: Symbol -> Symbol -> [Symbol]
$cenumFromThen :: Symbol -> Symbol -> [Symbol]
enumFrom :: Symbol -> [Symbol]
$cenumFrom :: Symbol -> [Symbol]
fromEnum :: Symbol -> Int
$cfromEnum :: Symbol -> Int
toEnum :: Int -> Symbol
$ctoEnum :: Int -> Symbol
pred :: Symbol -> Symbol
$cpred :: Symbol -> Symbol
succ :: Symbol -> Symbol
$csucc :: Symbol -> Symbol
Enum)

instance Bounded Symbol where
    minBound :: Symbol
minBound = Int -> Symbol
S Int
0
    maxBound :: Symbol
maxBound = Int -> Symbol
S Int
forall a. Bounded a => a
maxBound

symbol :: Int -> Symbol
symbol :: Int -> Symbol
symbol = Int -> Symbol
S

blankSymbol :: Symbol
blankSymbol :: Symbol
blankSymbol = Int -> Symbol
S Int
0