clingo-0.2.0.0: src/Clingo/Internal/Statistics.hs
-- | A module providing direct, but memory managed and somewhat safe, access to
-- the Clingo statistics interface. The preferred way to interface with the
-- statistics is the tree based interface in 'Clingo.Statistics'. This interface
-- exists solely for users who want to provide their own abstraction, without
-- having to reimplement memory management for the raw versions in
-- 'Clingo.Raw.Statistics'.
{-# LANGUAGE PatternSynonyms #-}
{-# OPTIONS_GHC -Wno-missing-pattern-synonym-signatures #-}
module Clingo.Internal.Statistics
(
Statistics,
StatisticsType,
pattern StatsEmpty,
pattern StatsValue,
pattern StatsArray,
pattern StatsMap,
SKey,
statisticsRoot,
statisticsType,
-- ** Array Access
statisticsArraySize,
statisticsArrayAt,
-- ** Map Access
statisticsMapSize,
statisticsMapSubkeyName,
statisticsMapAt,
-- ** Value Access
statisticsValueGet
)
where
import Control.Monad.Catch
import Control.Monad.IO.Class
import Data.Text (Text, pack, unpack)
import Numeric.Natural
import Foreign
import Foreign.C
import qualified Clingo.Raw as Raw
import Clingo.Internal.Types
import Clingo.Internal.Utils
newtype SKey = SKey Word64
deriving (Show, Eq, Ord)
statisticsRoot :: (MonadIO m, MonadThrow m) => Statistics s -> m SKey
statisticsRoot (Statistics s) =
SKey <$> marshall1 (Raw.statisticsRoot s)
newtype StatisticsType = StatisticsType Raw.StatisticsType
pattern StatsEmpty = StatisticsType Raw.StatsEmpty
pattern StatsValue = StatisticsType Raw.StatsValue
pattern StatsArray = StatisticsType Raw.StatsArray
pattern StatsMap = StatisticsType Raw.StatsMap
statisticsType :: (MonadIO m, MonadThrow m)
=> Statistics s -> SKey -> m StatisticsType
statisticsType (Statistics s) (SKey k) =
StatisticsType <$> marshall1 (Raw.statisticsType s k)
statisticsArraySize :: (MonadIO m, MonadThrow m)
=> Statistics s -> SKey -> m Natural
statisticsArraySize (Statistics s) (SKey k) =
fromIntegral <$> marshall1 (Raw.statisticsArraySize s k)
statisticsArrayAt :: (MonadIO m, MonadThrow m)
=> Statistics s -> SKey -> Natural -> m SKey
statisticsArrayAt (Statistics s) (SKey k) offset =
SKey <$> marshall1 (Raw.statisticsArrayAt s k (fromIntegral offset))
statisticsMapSize :: (MonadIO m, MonadThrow m)
=> Statistics s -> SKey -> m Natural
statisticsMapSize (Statistics s) (SKey k) =
fromIntegral <$> marshall1 (Raw.statisticsMapSize s k)
statisticsMapSubkeyName :: (MonadIO m, MonadThrow m)
=> Statistics s -> SKey -> Natural -> m Text
statisticsMapSubkeyName (Statistics s) (SKey k) offset = do
cstr <- marshall1 (Raw.statisticsMapSubkeyName s k (fromIntegral offset))
pack <$> liftIO (peekCString cstr)
statisticsMapAt :: (MonadIO m, MonadThrow m)
=> Statistics s -> SKey -> Text -> m SKey
statisticsMapAt (Statistics s) (SKey k) name =
SKey <$> marshall1 go
where go = withCString (unpack name) . flip (Raw.statisticsMapAt s k)
statisticsValueGet :: (MonadIO m, MonadThrow m)
=> Statistics s -> SKey -> m Double
statisticsValueGet (Statistics s) (SKey k) =
realToFrac <$> marshall1 (Raw.statisticsValueGet s k)