{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module HOCD.Types
  ( MemAddress(..)
  , memAddr
  , OCDConfig(..)
  , RegisterName(..)
  , regName
  , RegisterInfo(..)
  ) where

import Data.ByteString (ByteString)
import Data.Default.Class (Default(def))
import Data.Word (Word8, Word32, Word64)

newtype MemAddress = MemAddress
  { MemAddress -> Word32
unMemAddress :: Word32 }
  deriving (MemAddress -> MemAddress -> Bool
(MemAddress -> MemAddress -> Bool)
-> (MemAddress -> MemAddress -> Bool) -> Eq MemAddress
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: MemAddress -> MemAddress -> Bool
== :: MemAddress -> MemAddress -> Bool
$c/= :: MemAddress -> MemAddress -> Bool
/= :: MemAddress -> MemAddress -> Bool
Eq, Eq MemAddress
Eq MemAddress =>
(MemAddress -> MemAddress -> Ordering)
-> (MemAddress -> MemAddress -> Bool)
-> (MemAddress -> MemAddress -> Bool)
-> (MemAddress -> MemAddress -> Bool)
-> (MemAddress -> MemAddress -> Bool)
-> (MemAddress -> MemAddress -> MemAddress)
-> (MemAddress -> MemAddress -> MemAddress)
-> Ord MemAddress
MemAddress -> MemAddress -> Bool
MemAddress -> MemAddress -> Ordering
MemAddress -> MemAddress -> MemAddress
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 :: MemAddress -> MemAddress -> Ordering
compare :: MemAddress -> MemAddress -> Ordering
$c< :: MemAddress -> MemAddress -> Bool
< :: MemAddress -> MemAddress -> Bool
$c<= :: MemAddress -> MemAddress -> Bool
<= :: MemAddress -> MemAddress -> Bool
$c> :: MemAddress -> MemAddress -> Bool
> :: MemAddress -> MemAddress -> Bool
$c>= :: MemAddress -> MemAddress -> Bool
>= :: MemAddress -> MemAddress -> Bool
$cmax :: MemAddress -> MemAddress -> MemAddress
max :: MemAddress -> MemAddress -> MemAddress
$cmin :: MemAddress -> MemAddress -> MemAddress
min :: MemAddress -> MemAddress -> MemAddress
Ord, Int -> MemAddress -> ShowS
[MemAddress] -> ShowS
MemAddress -> String
(Int -> MemAddress -> ShowS)
-> (MemAddress -> String)
-> ([MemAddress] -> ShowS)
-> Show MemAddress
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> MemAddress -> ShowS
showsPrec :: Int -> MemAddress -> ShowS
$cshow :: MemAddress -> String
show :: MemAddress -> String
$cshowList :: [MemAddress] -> ShowS
showList :: [MemAddress] -> ShowS
Show, Integer -> MemAddress
MemAddress -> MemAddress
MemAddress -> MemAddress -> MemAddress
(MemAddress -> MemAddress -> MemAddress)
-> (MemAddress -> MemAddress -> MemAddress)
-> (MemAddress -> MemAddress -> MemAddress)
-> (MemAddress -> MemAddress)
-> (MemAddress -> MemAddress)
-> (MemAddress -> MemAddress)
-> (Integer -> MemAddress)
-> Num MemAddress
forall a.
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (Integer -> a)
-> Num a
$c+ :: MemAddress -> MemAddress -> MemAddress
+ :: MemAddress -> MemAddress -> MemAddress
$c- :: MemAddress -> MemAddress -> MemAddress
- :: MemAddress -> MemAddress -> MemAddress
$c* :: MemAddress -> MemAddress -> MemAddress
* :: MemAddress -> MemAddress -> MemAddress
$cnegate :: MemAddress -> MemAddress
negate :: MemAddress -> MemAddress
$cabs :: MemAddress -> MemAddress
abs :: MemAddress -> MemAddress
$csignum :: MemAddress -> MemAddress
signum :: MemAddress -> MemAddress
$cfromInteger :: Integer -> MemAddress
fromInteger :: Integer -> MemAddress
Num)

-- | Shorthand constructor
memAddr :: Word32 -> MemAddress
memAddr :: Word32 -> MemAddress
memAddr = Word32 -> MemAddress
MemAddress

data OCDConfig = OCDConfig
  { OCDConfig -> String
ocdHost :: String
  , OCDConfig -> Int
ocdPort :: Int
  } deriving (OCDConfig -> OCDConfig -> Bool
(OCDConfig -> OCDConfig -> Bool)
-> (OCDConfig -> OCDConfig -> Bool) -> Eq OCDConfig
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: OCDConfig -> OCDConfig -> Bool
== :: OCDConfig -> OCDConfig -> Bool
$c/= :: OCDConfig -> OCDConfig -> Bool
/= :: OCDConfig -> OCDConfig -> Bool
Eq, Eq OCDConfig
Eq OCDConfig =>
(OCDConfig -> OCDConfig -> Ordering)
-> (OCDConfig -> OCDConfig -> Bool)
-> (OCDConfig -> OCDConfig -> Bool)
-> (OCDConfig -> OCDConfig -> Bool)
-> (OCDConfig -> OCDConfig -> Bool)
-> (OCDConfig -> OCDConfig -> OCDConfig)
-> (OCDConfig -> OCDConfig -> OCDConfig)
-> Ord OCDConfig
OCDConfig -> OCDConfig -> Bool
OCDConfig -> OCDConfig -> Ordering
OCDConfig -> OCDConfig -> OCDConfig
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 :: OCDConfig -> OCDConfig -> Ordering
compare :: OCDConfig -> OCDConfig -> Ordering
$c< :: OCDConfig -> OCDConfig -> Bool
< :: OCDConfig -> OCDConfig -> Bool
$c<= :: OCDConfig -> OCDConfig -> Bool
<= :: OCDConfig -> OCDConfig -> Bool
$c> :: OCDConfig -> OCDConfig -> Bool
> :: OCDConfig -> OCDConfig -> Bool
$c>= :: OCDConfig -> OCDConfig -> Bool
>= :: OCDConfig -> OCDConfig -> Bool
$cmax :: OCDConfig -> OCDConfig -> OCDConfig
max :: OCDConfig -> OCDConfig -> OCDConfig
$cmin :: OCDConfig -> OCDConfig -> OCDConfig
min :: OCDConfig -> OCDConfig -> OCDConfig
Ord, Int -> OCDConfig -> ShowS
[OCDConfig] -> ShowS
OCDConfig -> String
(Int -> OCDConfig -> ShowS)
-> (OCDConfig -> String)
-> ([OCDConfig] -> ShowS)
-> Show OCDConfig
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> OCDConfig -> ShowS
showsPrec :: Int -> OCDConfig -> ShowS
$cshow :: OCDConfig -> String
show :: OCDConfig -> String
$cshowList :: [OCDConfig] -> ShowS
showList :: [OCDConfig] -> ShowS
Show)

instance Default OCDConfig where
  def :: OCDConfig
def =
    OCDConfig
      { ocdHost :: String
ocdHost = String
"127.0.0.1"
      , ocdPort :: Int
ocdPort = Int
6666
      }

newtype RegisterName = RegisterName
  { RegisterName -> ByteString
unRegisterName :: ByteString }
  deriving (RegisterName -> RegisterName -> Bool
(RegisterName -> RegisterName -> Bool)
-> (RegisterName -> RegisterName -> Bool) -> Eq RegisterName
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: RegisterName -> RegisterName -> Bool
== :: RegisterName -> RegisterName -> Bool
$c/= :: RegisterName -> RegisterName -> Bool
/= :: RegisterName -> RegisterName -> Bool
Eq, Eq RegisterName
Eq RegisterName =>
(RegisterName -> RegisterName -> Ordering)
-> (RegisterName -> RegisterName -> Bool)
-> (RegisterName -> RegisterName -> Bool)
-> (RegisterName -> RegisterName -> Bool)
-> (RegisterName -> RegisterName -> Bool)
-> (RegisterName -> RegisterName -> RegisterName)
-> (RegisterName -> RegisterName -> RegisterName)
-> Ord RegisterName
RegisterName -> RegisterName -> Bool
RegisterName -> RegisterName -> Ordering
RegisterName -> RegisterName -> RegisterName
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 :: RegisterName -> RegisterName -> Ordering
compare :: RegisterName -> RegisterName -> Ordering
$c< :: RegisterName -> RegisterName -> Bool
< :: RegisterName -> RegisterName -> Bool
$c<= :: RegisterName -> RegisterName -> Bool
<= :: RegisterName -> RegisterName -> Bool
$c> :: RegisterName -> RegisterName -> Bool
> :: RegisterName -> RegisterName -> Bool
$c>= :: RegisterName -> RegisterName -> Bool
>= :: RegisterName -> RegisterName -> Bool
$cmax :: RegisterName -> RegisterName -> RegisterName
max :: RegisterName -> RegisterName -> RegisterName
$cmin :: RegisterName -> RegisterName -> RegisterName
min :: RegisterName -> RegisterName -> RegisterName
Ord, Int -> RegisterName -> ShowS
[RegisterName] -> ShowS
RegisterName -> String
(Int -> RegisterName -> ShowS)
-> (RegisterName -> String)
-> ([RegisterName] -> ShowS)
-> Show RegisterName
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> RegisterName -> ShowS
showsPrec :: Int -> RegisterName -> ShowS
$cshow :: RegisterName -> String
show :: RegisterName -> String
$cshowList :: [RegisterName] -> ShowS
showList :: [RegisterName] -> ShowS
Show)

regName :: ByteString -> RegisterName
regName :: ByteString -> RegisterName
regName = ByteString -> RegisterName
RegisterName

data RegisterInfo = RegisterInfo
  { RegisterInfo -> Word8
registerInfoSize :: Word8
  , RegisterInfo -> Maybe Word64
registerInfoValue :: Maybe Word64
  , RegisterInfo -> Bool
registerInfoDirty :: Bool
  , RegisterInfo -> ByteString
registerInfoGroup :: ByteString
  } deriving (RegisterInfo -> RegisterInfo -> Bool
(RegisterInfo -> RegisterInfo -> Bool)
-> (RegisterInfo -> RegisterInfo -> Bool) -> Eq RegisterInfo
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: RegisterInfo -> RegisterInfo -> Bool
== :: RegisterInfo -> RegisterInfo -> Bool
$c/= :: RegisterInfo -> RegisterInfo -> Bool
/= :: RegisterInfo -> RegisterInfo -> Bool
Eq, Eq RegisterInfo
Eq RegisterInfo =>
(RegisterInfo -> RegisterInfo -> Ordering)
-> (RegisterInfo -> RegisterInfo -> Bool)
-> (RegisterInfo -> RegisterInfo -> Bool)
-> (RegisterInfo -> RegisterInfo -> Bool)
-> (RegisterInfo -> RegisterInfo -> Bool)
-> (RegisterInfo -> RegisterInfo -> RegisterInfo)
-> (RegisterInfo -> RegisterInfo -> RegisterInfo)
-> Ord RegisterInfo
RegisterInfo -> RegisterInfo -> Bool
RegisterInfo -> RegisterInfo -> Ordering
RegisterInfo -> RegisterInfo -> RegisterInfo
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 :: RegisterInfo -> RegisterInfo -> Ordering
compare :: RegisterInfo -> RegisterInfo -> Ordering
$c< :: RegisterInfo -> RegisterInfo -> Bool
< :: RegisterInfo -> RegisterInfo -> Bool
$c<= :: RegisterInfo -> RegisterInfo -> Bool
<= :: RegisterInfo -> RegisterInfo -> Bool
$c> :: RegisterInfo -> RegisterInfo -> Bool
> :: RegisterInfo -> RegisterInfo -> Bool
$c>= :: RegisterInfo -> RegisterInfo -> Bool
>= :: RegisterInfo -> RegisterInfo -> Bool
$cmax :: RegisterInfo -> RegisterInfo -> RegisterInfo
max :: RegisterInfo -> RegisterInfo -> RegisterInfo
$cmin :: RegisterInfo -> RegisterInfo -> RegisterInfo
min :: RegisterInfo -> RegisterInfo -> RegisterInfo
Ord, Int -> RegisterInfo -> ShowS
[RegisterInfo] -> ShowS
RegisterInfo -> String
(Int -> RegisterInfo -> ShowS)
-> (RegisterInfo -> String)
-> ([RegisterInfo] -> ShowS)
-> Show RegisterInfo
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> RegisterInfo -> ShowS
showsPrec :: Int -> RegisterInfo -> ShowS
$cshow :: RegisterInfo -> String
show :: RegisterInfo -> String
$cshowList :: [RegisterInfo] -> ShowS
showList :: [RegisterInfo] -> ShowS
Show)