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