module Language.Drasil.Printing.Import.Symbol (symbol, pUnit) where
import Language.Drasil (USymb(..))
import Language.Drasil.ShortHands (cDelta)
import Language.Drasil.Display (Decoration(..), Symbol(..))
import qualified Language.Drasil.Printing.AST as P
import Data.List (partition)
import Data.Bifunctor (second)
symbol :: Symbol -> P.Expr
symbol :: Symbol -> Expr
symbol (Variable s :: String
s) = String -> Expr
P.Ident String
s
symbol (Label s :: String
s) = String -> Expr
P.Label String
s
symbol (Integ n :: Int
n) = Integer -> Expr
P.Int (Int -> Integer
forall a. Integral a => a -> Integer
toInteger Int
n)
symbol (Special s :: Special
s) = Special -> Expr
P.Spec Special
s
symbol (Concat sl :: [Symbol]
sl) = [Expr] -> Expr
P.Row ([Expr] -> Expr) -> [Expr] -> Expr
forall a b. (a -> b) -> a -> b
$ (Symbol -> Expr) -> [Symbol] -> [Expr]
forall a b. (a -> b) -> [a] -> [b]
map Symbol -> Expr
symbol [Symbol]
sl
symbol (Corners [] [] [x :: Symbol
x] [] s :: Symbol
s) = [Expr] -> Expr
P.Row [[Expr] -> Expr
P.Row [Symbol -> Expr
symbol Symbol
s, Expr -> Expr
P.Sup (Expr -> Expr) -> Expr -> Expr
forall a b. (a -> b) -> a -> b
$ Symbol -> Expr
symbol Symbol
x]]
symbol (Corners [] [] [] [x :: Symbol
x] s :: Symbol
s) = [Expr] -> Expr
P.Row [[Expr] -> Expr
P.Row [Symbol -> Expr
symbol Symbol
s, Expr -> Expr
P.Sub (Expr -> Expr) -> Expr -> Expr
forall a b. (a -> b) -> a -> b
$ Symbol -> Expr
symbol Symbol
x]]
symbol (Corners [_] [] [] [] _) = String -> Expr
forall a. HasCallStack => String -> a
error "rendering of ul prescript"
symbol (Corners [] [_] [] [] _) = String -> Expr
forall a. HasCallStack => String -> a
error "rendering of ll prescript"
symbol Corners{} = String -> Expr
forall a. HasCallStack => String -> a
error "rendering of Corners (general)"
symbol (Atop f :: Decoration
f s :: Symbol
s) = Decoration -> Symbol -> Expr
sFormat Decoration
f Symbol
s
symbol Empty = [Expr] -> Expr
P.Row []
sFormat :: Decoration -> Symbol -> P.Expr
sFormat :: Decoration -> Symbol -> Expr
sFormat Hat s :: Symbol
s = OverSymb -> Expr -> Expr
P.Over OverSymb
P.Hat (Expr -> Expr) -> Expr -> Expr
forall a b. (a -> b) -> a -> b
$ Symbol -> Expr
symbol Symbol
s
sFormat Vector s :: Symbol
s = Fonts -> Expr -> Expr
P.Font Fonts
P.Bold (Expr -> Expr) -> Expr -> Expr
forall a b. (a -> b) -> a -> b
$ Symbol -> Expr
symbol Symbol
s
sFormat Prime s :: Symbol
s = [Expr] -> Expr
P.Row [Symbol -> Expr
symbol Symbol
s, Ops -> Expr
P.MO Ops
P.Prime]
sFormat Delta s :: Symbol
s = [Expr] -> Expr
P.Row [Symbol -> Expr
symbol Symbol
cDelta, Symbol -> Expr
symbol Symbol
s]
sFormat Magnitude s :: Symbol
s = Fence -> Fence -> Expr -> Expr
P.Fenced Fence
P.Norm Fence
P.Norm (Expr -> Expr) -> Expr -> Expr
forall a b. (a -> b) -> a -> b
$ Symbol -> Expr
symbol Symbol
s
pUnit :: USymb -> P.Expr
pUnit :: USymb -> Expr
pUnit (US ls :: [(Symbol, Integer)]
ls) = [(Symbol, Integer)] -> [(Symbol, Integer)] -> Expr
formatu [(Symbol, Integer)]
t [(Symbol, Integer)]
b
where
(t :: [(Symbol, Integer)]
t, b :: [(Symbol, Integer)]
b) = ((Symbol, Integer) -> Bool)
-> [(Symbol, Integer)]
-> ([(Symbol, Integer)], [(Symbol, Integer)])
forall a. (a -> Bool) -> [a] -> ([a], [a])
partition ((Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
> 0) (Integer -> Bool)
-> ((Symbol, Integer) -> Integer) -> (Symbol, Integer) -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Symbol, Integer) -> Integer
forall a b. (a, b) -> b
snd) [(Symbol, Integer)]
ls
formatu :: [(Symbol, Integer)] -> [(Symbol, Integer)] -> P.Expr
formatu :: [(Symbol, Integer)] -> [(Symbol, Integer)] -> Expr
formatu [] l :: [(Symbol, Integer)]
l = [(Symbol, Integer)] -> Expr
line [(Symbol, Integer)]
l
formatu l :: [(Symbol, Integer)]
l [] = [Expr] -> Expr
P.Row ([Expr] -> Expr) -> [Expr] -> Expr
forall a b. (a -> b) -> a -> b
$ ((Symbol, Integer) -> Expr) -> [(Symbol, Integer)] -> [Expr]
forall a b. (a -> b) -> [a] -> [b]
map (Symbol, Integer) -> Expr
powu [(Symbol, Integer)]
l
formatu nu :: [(Symbol, Integer)]
nu de :: [(Symbol, Integer)]
de = Expr -> Expr -> Expr
P.Div ([(Symbol, Integer)] -> Expr
line [(Symbol, Integer)]
nu) (Expr -> Expr) -> Expr -> Expr
forall a b. (a -> b) -> a -> b
$ [(Symbol, Integer)] -> Expr
line ([(Symbol, Integer)] -> Expr) -> [(Symbol, Integer)] -> Expr
forall a b. (a -> b) -> a -> b
$ ((Symbol, Integer) -> (Symbol, Integer))
-> [(Symbol, Integer)] -> [(Symbol, Integer)]
forall a b. (a -> b) -> [a] -> [b]
map ((Integer -> Integer) -> (Symbol, Integer) -> (Symbol, Integer)
forall (p :: * -> * -> *) b c a.
Bifunctor p =>
(b -> c) -> p a b -> p a c
second Integer -> Integer
forall a. Num a => a -> a
negate) [(Symbol, Integer)]
de
line :: [(Symbol, Integer)] -> P.Expr
line :: [(Symbol, Integer)] -> Expr
line [] = [Expr] -> Expr
P.Row []
line [n :: (Symbol, Integer)
n] = (Symbol, Integer) -> Expr
powu (Symbol, Integer)
n
line l :: [(Symbol, Integer)]
l = [Expr] -> Expr
P.Row ([Expr] -> Expr) -> [Expr] -> Expr
forall a b. (a -> b) -> a -> b
$ ((Symbol, Integer) -> Expr) -> [(Symbol, Integer)] -> [Expr]
forall a b. (a -> b) -> [a] -> [b]
map (Symbol, Integer) -> Expr
powu [(Symbol, Integer)]
l
powu :: (Symbol, Integer) -> P.Expr
powu :: (Symbol, Integer) -> Expr
powu (n :: Symbol
n, 1) = Symbol -> Expr
symbol Symbol
n
powu (n :: Symbol
n, p :: Integer
p) = [Expr] -> Expr
P.Row [Symbol -> Expr
symbol Symbol
n, Expr -> Expr
P.Sup (Expr -> Expr) -> Expr -> Expr
forall a b. (a -> b) -> a -> b
$ Integer -> Expr
P.Int Integer
p]