module IpeDb.InfoProv (
  InfoProv (..),
  IpeId (..),
  prettyIpeId,
) where

import Data.Int
import Data.Text (Text)
import qualified Data.Text as Text
import Data.Word
import qualified Database.SQLite.Simple as Sqlite
import qualified Database.SQLite.Simple.FromField as Sqlite
import qualified Database.SQLite.Simple.ToField as Sqlite
import GHC.Generics (Generic)
import qualified Numeric

data InfoProv = InfoProv
  { InfoProv -> IpeId
infoId :: !IpeId
  , InfoProv -> Text
tableName :: !Text
  , InfoProv -> Int64
closureDesc :: !Int64
  , InfoProv -> Text
typeDesc :: !Text
  , InfoProv -> Text
label :: !Text
  , InfoProv -> Text
moduleName :: !Text
  , InfoProv -> Text
srcLoc :: !Text
  }
  deriving (Int -> InfoProv -> ShowS
[InfoProv] -> ShowS
InfoProv -> String
(Int -> InfoProv -> ShowS)
-> (InfoProv -> String) -> ([InfoProv] -> ShowS) -> Show InfoProv
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> InfoProv -> ShowS
showsPrec :: Int -> InfoProv -> ShowS
$cshow :: InfoProv -> String
show :: InfoProv -> String
$cshowList :: [InfoProv] -> ShowS
showList :: [InfoProv] -> ShowS
Show, InfoProv -> InfoProv -> Bool
(InfoProv -> InfoProv -> Bool)
-> (InfoProv -> InfoProv -> Bool) -> Eq InfoProv
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: InfoProv -> InfoProv -> Bool
== :: InfoProv -> InfoProv -> Bool
$c/= :: InfoProv -> InfoProv -> Bool
/= :: InfoProv -> InfoProv -> Bool
Eq, Eq InfoProv
Eq InfoProv =>
(InfoProv -> InfoProv -> Ordering)
-> (InfoProv -> InfoProv -> Bool)
-> (InfoProv -> InfoProv -> Bool)
-> (InfoProv -> InfoProv -> Bool)
-> (InfoProv -> InfoProv -> Bool)
-> (InfoProv -> InfoProv -> InfoProv)
-> (InfoProv -> InfoProv -> InfoProv)
-> Ord InfoProv
InfoProv -> InfoProv -> Bool
InfoProv -> InfoProv -> Ordering
InfoProv -> InfoProv -> InfoProv
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 :: InfoProv -> InfoProv -> Ordering
compare :: InfoProv -> InfoProv -> Ordering
$c< :: InfoProv -> InfoProv -> Bool
< :: InfoProv -> InfoProv -> Bool
$c<= :: InfoProv -> InfoProv -> Bool
<= :: InfoProv -> InfoProv -> Bool
$c> :: InfoProv -> InfoProv -> Bool
> :: InfoProv -> InfoProv -> Bool
$c>= :: InfoProv -> InfoProv -> Bool
>= :: InfoProv -> InfoProv -> Bool
$cmax :: InfoProv -> InfoProv -> InfoProv
max :: InfoProv -> InfoProv -> InfoProv
$cmin :: InfoProv -> InfoProv -> InfoProv
min :: InfoProv -> InfoProv -> InfoProv
Ord, (forall x. InfoProv -> Rep InfoProv x)
-> (forall x. Rep InfoProv x -> InfoProv) -> Generic InfoProv
forall x. Rep InfoProv x -> InfoProv
forall x. InfoProv -> Rep InfoProv x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. InfoProv -> Rep InfoProv x
from :: forall x. InfoProv -> Rep InfoProv x
$cto :: forall x. Rep InfoProv x -> InfoProv
to :: forall x. Rep InfoProv x -> InfoProv
Generic)
  deriving anyclass (RowParser InfoProv
RowParser InfoProv -> FromRow InfoProv
forall a. RowParser a -> FromRow a
$cfromRow :: RowParser InfoProv
fromRow :: RowParser InfoProv
Sqlite.FromRow, InfoProv -> [SQLData]
(InfoProv -> [SQLData]) -> ToRow InfoProv
forall a. (a -> [SQLData]) -> ToRow a
$ctoRow :: InfoProv -> [SQLData]
toRow :: InfoProv -> [SQLData]
Sqlite.ToRow)

newtype IpeId = IpeId
  { IpeId -> Word64
id :: Word64
  }
  deriving (IpeId -> IpeId -> Bool
(IpeId -> IpeId -> Bool) -> (IpeId -> IpeId -> Bool) -> Eq IpeId
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: IpeId -> IpeId -> Bool
== :: IpeId -> IpeId -> Bool
$c/= :: IpeId -> IpeId -> Bool
/= :: IpeId -> IpeId -> Bool
Eq, Eq IpeId
Eq IpeId =>
(IpeId -> IpeId -> Ordering)
-> (IpeId -> IpeId -> Bool)
-> (IpeId -> IpeId -> Bool)
-> (IpeId -> IpeId -> Bool)
-> (IpeId -> IpeId -> Bool)
-> (IpeId -> IpeId -> IpeId)
-> (IpeId -> IpeId -> IpeId)
-> Ord IpeId
IpeId -> IpeId -> Bool
IpeId -> IpeId -> Ordering
IpeId -> IpeId -> IpeId
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 :: IpeId -> IpeId -> Ordering
compare :: IpeId -> IpeId -> Ordering
$c< :: IpeId -> IpeId -> Bool
< :: IpeId -> IpeId -> Bool
$c<= :: IpeId -> IpeId -> Bool
<= :: IpeId -> IpeId -> Bool
$c> :: IpeId -> IpeId -> Bool
> :: IpeId -> IpeId -> Bool
$c>= :: IpeId -> IpeId -> Bool
>= :: IpeId -> IpeId -> Bool
$cmax :: IpeId -> IpeId -> IpeId
max :: IpeId -> IpeId -> IpeId
$cmin :: IpeId -> IpeId -> IpeId
min :: IpeId -> IpeId -> IpeId
Ord)
  deriving newtype (FieldParser IpeId
FieldParser IpeId -> FromField IpeId
forall a. FieldParser a -> FromField a
$cfromField :: FieldParser IpeId
fromField :: FieldParser IpeId
Sqlite.FromField, IpeId -> SQLData
(IpeId -> SQLData) -> ToField IpeId
forall a. (a -> SQLData) -> ToField a
$ctoField :: IpeId -> SQLData
toField :: IpeId -> SQLData
Sqlite.ToField)

instance Show IpeId where
  show :: IpeId -> String
show IpeId
ipeId = String
"IpeId {id = " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> Word64 -> String
forall a. Integral a => a -> String
showAsHex (IpeId
ipeId.id) String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
"}"

showAsHex :: (Integral a) => a -> String
showAsHex :: forall a. Integral a => a -> String
showAsHex a
n = String
"0x" String -> ShowS
forall a. Semigroup a => a -> a -> a
<> a -> ShowS
forall a. Integral a => a -> ShowS
Numeric.showHex a
n String
""

prettyIpeId :: IpeId -> Text
prettyIpeId :: IpeId -> Text
prettyIpeId = String -> Text
Text.pack (String -> Text) -> (IpeId -> String) -> IpeId -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word64 -> String
forall a. Integral a => a -> String
showAsHex (Word64 -> String) -> (IpeId -> Word64) -> IpeId -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (.id)