module Language.Drasil.Symbol (
Decoration(..), Symbol(..),
HasSymbol(..),
compsy
) where
import Language.Drasil.Stages (Stage)
import Language.Drasil.Unicode(Special)
import Data.Char (toLower)
data Decoration =
Hat
| Vector
| Prime
| Delta
| Magnitude
deriving (Decoration -> Decoration -> Bool
(Decoration -> Decoration -> Bool)
-> (Decoration -> Decoration -> Bool) -> Eq Decoration
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Decoration -> Decoration -> Bool
$c/= :: Decoration -> Decoration -> Bool
== :: Decoration -> Decoration -> Bool
$c== :: Decoration -> Decoration -> Bool
Eq, Eq Decoration
Eq Decoration =>
(Decoration -> Decoration -> Ordering)
-> (Decoration -> Decoration -> Bool)
-> (Decoration -> Decoration -> Bool)
-> (Decoration -> Decoration -> Bool)
-> (Decoration -> Decoration -> Bool)
-> (Decoration -> Decoration -> Decoration)
-> (Decoration -> Decoration -> Decoration)
-> Ord Decoration
Decoration -> Decoration -> Bool
Decoration -> Decoration -> Ordering
Decoration -> Decoration -> Decoration
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 :: Decoration -> Decoration -> Decoration
$cmin :: Decoration -> Decoration -> Decoration
max :: Decoration -> Decoration -> Decoration
$cmax :: Decoration -> Decoration -> Decoration
>= :: Decoration -> Decoration -> Bool
$c>= :: Decoration -> Decoration -> Bool
> :: Decoration -> Decoration -> Bool
$c> :: Decoration -> Decoration -> Bool
<= :: Decoration -> Decoration -> Bool
$c<= :: Decoration -> Decoration -> Bool
< :: Decoration -> Decoration -> Bool
$c< :: Decoration -> Decoration -> Bool
compare :: Decoration -> Decoration -> Ordering
$ccompare :: Decoration -> Decoration -> Ordering
$cp1Ord :: Eq Decoration
Ord)
data Symbol =
Variable String
| Label String
| Integ Int
| Special Special
| Atop Decoration Symbol
| Corners [Symbol] [Symbol] [Symbol] [Symbol] Symbol
| Concat [Symbol]
| Empty
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
class HasSymbol c where
symbol :: c -> Stage -> Symbol
instance Semigroup Symbol where
a :: Symbol
a <> :: Symbol -> Symbol -> Symbol
<> b :: Symbol
b = [Symbol] -> Symbol
Concat [Symbol
a , Symbol
b]
instance Monoid Symbol where
mempty :: Symbol
mempty = Symbol
Empty
mappend :: Symbol -> Symbol -> Symbol
mappend a :: Symbol
a b :: Symbol
b = [Symbol] -> Symbol
Concat [Symbol
a , Symbol
b]
complsy :: [Symbol] -> [Symbol] -> Ordering
complsy :: [Symbol] -> [Symbol] -> Ordering
complsy [] [] = Ordering
EQ
complsy [] _ = Ordering
LT
complsy _ [] = Ordering
GT
complsy (x :: Symbol
x : xs :: [Symbol]
xs) (y :: Symbol
y : ys :: [Symbol]
ys) = Symbol -> Symbol -> Ordering
compsy Symbol
x Symbol
y Ordering -> Ordering -> Ordering
forall a. Monoid a => a -> a -> a
`mappend` [Symbol] -> [Symbol] -> Ordering
complsy [Symbol]
xs [Symbol]
ys
compsy :: Symbol -> Symbol -> Ordering
compsy :: Symbol -> Symbol -> Ordering
compsy (Concat x :: [Symbol]
x) (Concat y :: [Symbol]
y) = [Symbol] -> [Symbol] -> Ordering
complsy [Symbol]
x [Symbol]
y
compsy (Concat a :: [Symbol]
a) b :: Symbol
b = [Symbol] -> [Symbol] -> Ordering
complsy [Symbol]
a [Symbol
b]
compsy b :: Symbol
b (Concat a :: [Symbol]
a) = [Symbol] -> [Symbol] -> Ordering
complsy [Symbol
b] [Symbol]
a
compsy (Atop d1 :: Decoration
d1 a :: Symbol
a) (Atop d2 :: Decoration
d2 a' :: Symbol
a') =
case Symbol -> Symbol -> Ordering
compsy Symbol
a Symbol
a' of
EQ -> Decoration -> Decoration -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Decoration
d1 Decoration
d2
other :: Ordering
other -> Ordering
other
compsy a :: Symbol
a (Atop Magnitude b :: Symbol
b) =
case Symbol -> Symbol -> Ordering
compsy Symbol
a Symbol
b of
EQ -> Ordering
LT
other :: Ordering
other -> Ordering
other
compsy (Atop Magnitude b :: Symbol
b) a :: Symbol
a =
case Symbol -> Symbol -> Ordering
compsy Symbol
b Symbol
a of
EQ -> Ordering
GT
other :: Ordering
other -> Ordering
other
compsy a :: Symbol
a (Atop Delta b :: Symbol
b) =
case Symbol -> Symbol -> Ordering
compsy Symbol
a Symbol
b of
EQ -> Ordering
LT
other :: Ordering
other -> Ordering
other
compsy (Atop Delta b :: Symbol
b) a :: Symbol
a =
case Symbol -> Symbol -> Ordering
compsy Symbol
b Symbol
a of
EQ -> Ordering
GT
other :: Ordering
other -> Ordering
other
compsy (Corners [] [] ur :: [Symbol]
ur [] (Corners [] [] [] lr :: [Symbol]
lr b :: Symbol
b)) a :: Symbol
a = Symbol -> Symbol -> Ordering
compsy ([Symbol] -> [Symbol] -> [Symbol] -> [Symbol] -> Symbol -> Symbol
Corners [] [] [Symbol]
ur [Symbol]
lr Symbol
b) Symbol
a
compsy a :: Symbol
a (Corners [] [] ur :: [Symbol]
ur [] (Corners [] [] [] lr :: [Symbol]
lr b :: Symbol
b)) = Symbol -> Symbol -> Ordering
compsy Symbol
a ([Symbol] -> [Symbol] -> [Symbol] -> [Symbol] -> Symbol -> Symbol
Corners [] [] [Symbol]
ur [Symbol]
lr Symbol
b)
compsy (Corners _ _ u :: [Symbol]
u l :: [Symbol]
l b :: Symbol
b) (Corners _ _ u' :: [Symbol]
u' l' :: [Symbol]
l' b' :: Symbol
b') =
case Symbol -> Symbol -> Ordering
compsy Symbol
b Symbol
b' of
EQ -> case [Symbol] -> [Symbol] -> Ordering
complsy [Symbol]
l [Symbol]
l' of
EQ -> [Symbol] -> [Symbol] -> Ordering
complsy [Symbol]
u [Symbol]
u'
other :: Ordering
other -> Ordering
other
other :: Ordering
other -> Ordering
other
compsy a :: Symbol
a (Corners _ _ _ _ b :: Symbol
b) =
case Symbol -> Symbol -> Ordering
compsy Symbol
a Symbol
b of
EQ -> Ordering
LT
other :: Ordering
other -> Ordering
other
compsy (Corners _ _ _ _ b :: Symbol
b) a :: Symbol
a =
case Symbol -> Symbol -> Ordering
compsy Symbol
b Symbol
a of
EQ -> Ordering
GT
other :: Ordering
other -> Ordering
other
compsy a :: Symbol
a (Atop _ b :: Symbol
b) =
case Symbol -> Symbol -> Ordering
compsy Symbol
a Symbol
b of
EQ -> Ordering
LT
other :: Ordering
other -> Ordering
other
compsy (Atop _ b :: Symbol
b) a :: Symbol
a =
case Symbol -> Symbol -> Ordering
compsy Symbol
b Symbol
a of
EQ -> Ordering
GT
other :: Ordering
other -> Ordering
other
compsy (Special a :: Special
a) (Special b :: Special
b) = Special -> Special -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Special
a Special
b
compsy (Integ x :: Int
x) (Integ y :: Int
y) = Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Int
x Int
y
compsy (Variable x :: String
x) (Variable y :: String
y) = String -> String -> Ordering
compsyLower String
x String
y
compsy (Variable x :: String
x) (Label y :: String
y) = String -> String -> Ordering
compsyLower String
x String
y
compsy (Label x :: String
x) (Variable y :: String
y) = String -> String -> Ordering
compsyLower String
x String
y
compsy (Label x :: String
x) (Label y :: String
y) = String -> String -> Ordering
compsyLower String
x String
y
compsy (Special _) _ = Ordering
LT
compsy _ (Special _) = Ordering
GT
compsy (Integ _) _ = Ordering
LT
compsy _ (Integ _) = Ordering
GT
compsy (Variable _) _ = Ordering
LT
compsy _ (Variable _) = Ordering
GT
compsy (Label _) _ = Ordering
LT
compsy _ (Label _) = Ordering
GT
compsy Empty Empty = Ordering
EQ
compsyLower :: String -> String -> Ordering
compsyLower :: String -> String -> Ordering
compsyLower x :: String
x y :: String
y = case String -> String -> Ordering
forall a. Ord a => a -> a -> Ordering
compare ((Char -> Char) -> String -> String
forall a b. (a -> b) -> [a] -> [b]
map Char -> Char
toLower String
x) ((Char -> Char) -> String -> String
forall a b. (a -> b) -> [a] -> [b]
map Char -> Char
toLower String
y) of
EQ -> String -> String -> Ordering
forall a. Ord a => a -> a -> Ordering
compare String
x String
y
other :: Ordering
other -> Ordering
other