{-# LANGUAGE PartialTypeSignatures , FlexibleContexts, Strict, DeriveGeneric, StandaloneDeriving #-}
module Data.Symbol where
import Data.Word
import GHC.Generics
import qualified Data.Serialize as Cereal hiding (get,put)
import qualified Numeric (showHex)
data Symbol =
PointerToLabel String Bool
| PointerToObject String Bool
| AddressOfObject String Bool
| AddressOfLabel String Bool
| Relocated_ResolvedObject String Word64
deriving ((forall x. Symbol -> Rep Symbol x)
-> (forall x. Rep Symbol x -> Symbol) -> Generic Symbol
forall x. Rep Symbol x -> Symbol
forall x. Symbol -> Rep Symbol x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Symbol -> Rep Symbol x
from :: forall x. Symbol -> Rep Symbol x
$cto :: forall x. Rep Symbol x -> Symbol
to :: forall x. Rep Symbol x -> Symbol
Generic,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,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
$ccompare :: Symbol -> Symbol -> Ordering
compare :: Symbol -> Symbol -> Ordering
$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
>= :: Symbol -> Symbol -> Bool
$cmax :: Symbol -> Symbol -> Symbol
max :: Symbol -> Symbol -> Symbol
$cmin :: Symbol -> Symbol -> Symbol
min :: Symbol -> Symbol -> Symbol
Ord)
instance Show Symbol where
show :: Symbol -> String
show (PointerToLabel String
l Bool
ex) = String
"&" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
l String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"_" String -> ShowS
forall a. [a] -> [a] -> [a]
++ Bool -> String
show_ex Bool
ex
show (PointerToObject String
o Bool
ex) = String
"&" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
o String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"_" String -> ShowS
forall a. [a] -> [a] -> [a]
++ Bool -> String
show_ex Bool
ex
show (AddressOfObject String
o Bool
ex) = String
o String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"_" String -> ShowS
forall a. [a] -> [a] -> [a]
++ Bool -> String
show_ex Bool
ex
show (AddressOfLabel String
l Bool
ex) = String
l String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"_" String -> ShowS
forall a. [a] -> [a] -> [a]
++ Bool -> String
show_ex Bool
ex
show (Relocated_ResolvedObject String
o Word64
a) = String
o String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"@0x" String -> ShowS
forall a. [a] -> [a] -> [a]
++ (if Word64
a Word64 -> Word64 -> Bool
forall a. Ord a => a -> a -> Bool
< Word64
0 then Word64 -> ShowS
forall a. Integral a => a -> ShowS
Numeric.showHex (Word64 -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
a :: Word64) String
"" else Word64 -> ShowS
forall a. Integral a => a -> ShowS
Numeric.showHex Word64
a String
"")
show_ex :: Bool -> String
show_ex Bool
True = String
"ex"
show_ex Bool
False = String
"in"
instance Cereal.Serialize Symbol