{-# LANGUAGE TemplateHaskell #-}
module Swarm.Game.Scenario.Scoring.ConcreteMetrics where
import Control.Lens hiding (from, (<.>))
import Data.Aeson
import Data.Char (toLower)
import Data.Time (NominalDiffTime)
import GHC.Generics (Generic)
import Swarm.Game.Scenario.Scoring.CodeSize
import Swarm.Game.Tick (TickNumber (..))
scenarioOptions :: Options
scenarioOptions :: Options
scenarioOptions =
Options
defaultOptions
{ fieldLabelModifier = map toLower . drop (length ("_scenario" :: String))
}
data DurationMetrics = DurationMetrics
{ DurationMetrics -> NominalDiffTime
_scenarioElapsed :: NominalDiffTime
, DurationMetrics -> TickNumber
_scenarioElapsedTicks :: TickNumber
}
deriving (DurationMetrics -> DurationMetrics -> Bool
(DurationMetrics -> DurationMetrics -> Bool)
-> (DurationMetrics -> DurationMetrics -> Bool)
-> Eq DurationMetrics
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: DurationMetrics -> DurationMetrics -> Bool
== :: DurationMetrics -> DurationMetrics -> Bool
$c/= :: DurationMetrics -> DurationMetrics -> Bool
/= :: DurationMetrics -> DurationMetrics -> Bool
Eq, Eq DurationMetrics
Eq DurationMetrics =>
(DurationMetrics -> DurationMetrics -> Ordering)
-> (DurationMetrics -> DurationMetrics -> Bool)
-> (DurationMetrics -> DurationMetrics -> Bool)
-> (DurationMetrics -> DurationMetrics -> Bool)
-> (DurationMetrics -> DurationMetrics -> Bool)
-> (DurationMetrics -> DurationMetrics -> DurationMetrics)
-> (DurationMetrics -> DurationMetrics -> DurationMetrics)
-> Ord DurationMetrics
DurationMetrics -> DurationMetrics -> Bool
DurationMetrics -> DurationMetrics -> Ordering
DurationMetrics -> DurationMetrics -> DurationMetrics
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 :: DurationMetrics -> DurationMetrics -> Ordering
compare :: DurationMetrics -> DurationMetrics -> Ordering
$c< :: DurationMetrics -> DurationMetrics -> Bool
< :: DurationMetrics -> DurationMetrics -> Bool
$c<= :: DurationMetrics -> DurationMetrics -> Bool
<= :: DurationMetrics -> DurationMetrics -> Bool
$c> :: DurationMetrics -> DurationMetrics -> Bool
> :: DurationMetrics -> DurationMetrics -> Bool
$c>= :: DurationMetrics -> DurationMetrics -> Bool
>= :: DurationMetrics -> DurationMetrics -> Bool
$cmax :: DurationMetrics -> DurationMetrics -> DurationMetrics
max :: DurationMetrics -> DurationMetrics -> DurationMetrics
$cmin :: DurationMetrics -> DurationMetrics -> DurationMetrics
min :: DurationMetrics -> DurationMetrics -> DurationMetrics
Ord, Int -> DurationMetrics -> [Char] -> [Char]
[DurationMetrics] -> [Char] -> [Char]
DurationMetrics -> [Char]
(Int -> DurationMetrics -> [Char] -> [Char])
-> (DurationMetrics -> [Char])
-> ([DurationMetrics] -> [Char] -> [Char])
-> Show DurationMetrics
forall a.
(Int -> a -> [Char] -> [Char])
-> (a -> [Char]) -> ([a] -> [Char] -> [Char]) -> Show a
$cshowsPrec :: Int -> DurationMetrics -> [Char] -> [Char]
showsPrec :: Int -> DurationMetrics -> [Char] -> [Char]
$cshow :: DurationMetrics -> [Char]
show :: DurationMetrics -> [Char]
$cshowList :: [DurationMetrics] -> [Char] -> [Char]
showList :: [DurationMetrics] -> [Char] -> [Char]
Show, ReadPrec [DurationMetrics]
ReadPrec DurationMetrics
Int -> ReadS DurationMetrics
ReadS [DurationMetrics]
(Int -> ReadS DurationMetrics)
-> ReadS [DurationMetrics]
-> ReadPrec DurationMetrics
-> ReadPrec [DurationMetrics]
-> Read DurationMetrics
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS DurationMetrics
readsPrec :: Int -> ReadS DurationMetrics
$creadList :: ReadS [DurationMetrics]
readList :: ReadS [DurationMetrics]
$creadPrec :: ReadPrec DurationMetrics
readPrec :: ReadPrec DurationMetrics
$creadListPrec :: ReadPrec [DurationMetrics]
readListPrec :: ReadPrec [DurationMetrics]
Read, (forall x. DurationMetrics -> Rep DurationMetrics x)
-> (forall x. Rep DurationMetrics x -> DurationMetrics)
-> Generic DurationMetrics
forall x. Rep DurationMetrics x -> DurationMetrics
forall x. DurationMetrics -> Rep DurationMetrics x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. DurationMetrics -> Rep DurationMetrics x
from :: forall x. DurationMetrics -> Rep DurationMetrics x
$cto :: forall x. Rep DurationMetrics x -> DurationMetrics
to :: forall x. Rep DurationMetrics x -> DurationMetrics
Generic)
makeLenses ''DurationMetrics
emptyDurationMetric :: DurationMetrics
emptyDurationMetric :: DurationMetrics
emptyDurationMetric = NominalDiffTime -> TickNumber -> DurationMetrics
DurationMetrics NominalDiffTime
0 (TickNumber -> DurationMetrics) -> TickNumber -> DurationMetrics
forall a b. (a -> b) -> a -> b
$ Int64 -> TickNumber
TickNumber Int64
0
instance FromJSON DurationMetrics where
parseJSON :: Value -> Parser DurationMetrics
parseJSON = Options -> Value -> Parser DurationMetrics
forall a.
(Generic a, GFromJSON Zero (Rep a)) =>
Options -> Value -> Parser a
genericParseJSON Options
scenarioOptions
instance ToJSON DurationMetrics where
toEncoding :: DurationMetrics -> Encoding
toEncoding = Options -> DurationMetrics -> Encoding
forall a.
(Generic a, GToJSON' Encoding Zero (Rep a)) =>
Options -> a -> Encoding
genericToEncoding Options
scenarioOptions
toJSON :: DurationMetrics -> Value
toJSON = Options -> DurationMetrics -> Value
forall a.
(Generic a, GToJSON' Value Zero (Rep a)) =>
Options -> a -> Value
genericToJSON Options
scenarioOptions
data AttemptMetrics = AttemptMetrics
{ AttemptMetrics -> DurationMetrics
_scenarioDurationMetrics :: DurationMetrics
, AttemptMetrics -> Maybe ScenarioCodeMetrics
_scenarioCodeMetrics :: Maybe ScenarioCodeMetrics
}
deriving (AttemptMetrics -> AttemptMetrics -> Bool
(AttemptMetrics -> AttemptMetrics -> Bool)
-> (AttemptMetrics -> AttemptMetrics -> Bool) -> Eq AttemptMetrics
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: AttemptMetrics -> AttemptMetrics -> Bool
== :: AttemptMetrics -> AttemptMetrics -> Bool
$c/= :: AttemptMetrics -> AttemptMetrics -> Bool
/= :: AttemptMetrics -> AttemptMetrics -> Bool
Eq, Eq AttemptMetrics
Eq AttemptMetrics =>
(AttemptMetrics -> AttemptMetrics -> Ordering)
-> (AttemptMetrics -> AttemptMetrics -> Bool)
-> (AttemptMetrics -> AttemptMetrics -> Bool)
-> (AttemptMetrics -> AttemptMetrics -> Bool)
-> (AttemptMetrics -> AttemptMetrics -> Bool)
-> (AttemptMetrics -> AttemptMetrics -> AttemptMetrics)
-> (AttemptMetrics -> AttemptMetrics -> AttemptMetrics)
-> Ord AttemptMetrics
AttemptMetrics -> AttemptMetrics -> Bool
AttemptMetrics -> AttemptMetrics -> Ordering
AttemptMetrics -> AttemptMetrics -> AttemptMetrics
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 :: AttemptMetrics -> AttemptMetrics -> Ordering
compare :: AttemptMetrics -> AttemptMetrics -> Ordering
$c< :: AttemptMetrics -> AttemptMetrics -> Bool
< :: AttemptMetrics -> AttemptMetrics -> Bool
$c<= :: AttemptMetrics -> AttemptMetrics -> Bool
<= :: AttemptMetrics -> AttemptMetrics -> Bool
$c> :: AttemptMetrics -> AttemptMetrics -> Bool
> :: AttemptMetrics -> AttemptMetrics -> Bool
$c>= :: AttemptMetrics -> AttemptMetrics -> Bool
>= :: AttemptMetrics -> AttemptMetrics -> Bool
$cmax :: AttemptMetrics -> AttemptMetrics -> AttemptMetrics
max :: AttemptMetrics -> AttemptMetrics -> AttemptMetrics
$cmin :: AttemptMetrics -> AttemptMetrics -> AttemptMetrics
min :: AttemptMetrics -> AttemptMetrics -> AttemptMetrics
Ord, Int -> AttemptMetrics -> [Char] -> [Char]
[AttemptMetrics] -> [Char] -> [Char]
AttemptMetrics -> [Char]
(Int -> AttemptMetrics -> [Char] -> [Char])
-> (AttemptMetrics -> [Char])
-> ([AttemptMetrics] -> [Char] -> [Char])
-> Show AttemptMetrics
forall a.
(Int -> a -> [Char] -> [Char])
-> (a -> [Char]) -> ([a] -> [Char] -> [Char]) -> Show a
$cshowsPrec :: Int -> AttemptMetrics -> [Char] -> [Char]
showsPrec :: Int -> AttemptMetrics -> [Char] -> [Char]
$cshow :: AttemptMetrics -> [Char]
show :: AttemptMetrics -> [Char]
$cshowList :: [AttemptMetrics] -> [Char] -> [Char]
showList :: [AttemptMetrics] -> [Char] -> [Char]
Show, ReadPrec [AttemptMetrics]
ReadPrec AttemptMetrics
Int -> ReadS AttemptMetrics
ReadS [AttemptMetrics]
(Int -> ReadS AttemptMetrics)
-> ReadS [AttemptMetrics]
-> ReadPrec AttemptMetrics
-> ReadPrec [AttemptMetrics]
-> Read AttemptMetrics
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS AttemptMetrics
readsPrec :: Int -> ReadS AttemptMetrics
$creadList :: ReadS [AttemptMetrics]
readList :: ReadS [AttemptMetrics]
$creadPrec :: ReadPrec AttemptMetrics
readPrec :: ReadPrec AttemptMetrics
$creadListPrec :: ReadPrec [AttemptMetrics]
readListPrec :: ReadPrec [AttemptMetrics]
Read, (forall x. AttemptMetrics -> Rep AttemptMetrics x)
-> (forall x. Rep AttemptMetrics x -> AttemptMetrics)
-> Generic AttemptMetrics
forall x. Rep AttemptMetrics x -> AttemptMetrics
forall x. AttemptMetrics -> Rep AttemptMetrics x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. AttemptMetrics -> Rep AttemptMetrics x
from :: forall x. AttemptMetrics -> Rep AttemptMetrics x
$cto :: forall x. Rep AttemptMetrics x -> AttemptMetrics
to :: forall x. Rep AttemptMetrics x -> AttemptMetrics
Generic)
emptyAttemptMetric :: AttemptMetrics
emptyAttemptMetric :: AttemptMetrics
emptyAttemptMetric = DurationMetrics -> Maybe ScenarioCodeMetrics -> AttemptMetrics
AttemptMetrics DurationMetrics
emptyDurationMetric Maybe ScenarioCodeMetrics
forall a. Maybe a
Nothing
makeLenses ''AttemptMetrics
instance FromJSON AttemptMetrics where
parseJSON :: Value -> Parser AttemptMetrics
parseJSON = Options -> Value -> Parser AttemptMetrics
forall a.
(Generic a, GFromJSON Zero (Rep a)) =>
Options -> Value -> Parser a
genericParseJSON Options
scenarioOptions
instance ToJSON AttemptMetrics where
toEncoding :: AttemptMetrics -> Encoding
toEncoding = Options -> AttemptMetrics -> Encoding
forall a.
(Generic a, GToJSON' Encoding Zero (Rep a)) =>
Options -> a -> Encoding
genericToEncoding Options
scenarioOptions
toJSON :: AttemptMetrics -> Value
toJSON = Options -> AttemptMetrics -> Value
forall a.
(Generic a, GToJSON' Value Zero (Rep a)) =>
Options -> a -> Value
genericToJSON Options
scenarioOptions