{-# LANGUAGE RankNTypes #-}
module Mcmc.Monitor.Parameter
  ( 
    MonitorParameter (..),
    (>$<),
    monitorInt,
    monitorDouble,
    monitorDoubleF,
    monitorDoubleE,
  )
where
import qualified Data.ByteString.Builder as BB
import qualified Data.Double.Conversion.ByteString as BC
import Data.Functor.Contravariant
data MonitorParameter a = MonitorParameter
  { 
    MonitorParameter a -> String
mpName :: String,
    
    MonitorParameter a -> a -> Builder
mpFunc :: a -> BB.Builder
  }
instance Contravariant MonitorParameter where
  contramap :: (a -> b) -> MonitorParameter b -> MonitorParameter a
contramap a -> b
f (MonitorParameter String
n b -> Builder
m) = String -> (a -> Builder) -> MonitorParameter a
forall a. String -> (a -> Builder) -> MonitorParameter a
MonitorParameter String
n (b -> Builder
m (b -> Builder) -> (a -> b) -> a -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> b
f)
monitorInt ::
  
  String ->
  MonitorParameter Int
monitorInt :: String -> MonitorParameter Int
monitorInt String
n = String -> (Int -> Builder) -> MonitorParameter Int
forall a. String -> (a -> Builder) -> MonitorParameter a
MonitorParameter String
n Int -> Builder
BB.intDec
monitorDouble ::
  
  String ->
  MonitorParameter Double
monitorDouble :: String -> MonitorParameter Double
monitorDouble String
n = String -> (Double -> Builder) -> MonitorParameter Double
forall a. String -> (a -> Builder) -> MonitorParameter a
MonitorParameter String
n (ByteString -> Builder
BB.byteString (ByteString -> Builder)
-> (Double -> ByteString) -> Double -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Double -> ByteString
BC.toFixed Int
8)
monitorDoubleF ::
  
  String ->
  MonitorParameter Double
monitorDoubleF :: String -> MonitorParameter Double
monitorDoubleF String
n = String -> (Double -> Builder) -> MonitorParameter Double
forall a. String -> (a -> Builder) -> MonitorParameter a
MonitorParameter String
n (ByteString -> Builder
BB.byteString (ByteString -> Builder)
-> (Double -> ByteString) -> Double -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Double -> ByteString
BC.toShortest)
monitorDoubleE ::
  
  String ->
  MonitorParameter Double
monitorDoubleE :: String -> MonitorParameter Double
monitorDoubleE String
n = String -> (Double -> Builder) -> MonitorParameter Double
forall a. String -> (a -> Builder) -> MonitorParameter a
MonitorParameter String
n (ByteString -> Builder
BB.byteString (ByteString -> Builder)
-> (Double -> ByteString) -> Double -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Double -> ByteString
BC.toExponential Int
8)