module Swarm.Game.Scenario.Scoring.CodeSize where
import Control.Monad (guard)
import Data.Aeson
import Data.Data (Data)
import GHC.Generics (Generic)
import Swarm.Language.Syntax
data CodeSizeDeterminators = CodeSizeDeterminators
{ CodeSizeDeterminators -> Maybe Syntax
initialCode :: Maybe Syntax
, CodeSizeDeterminators -> Bool
hasUsedREPL :: Bool
}
deriving (Int -> CodeSizeDeterminators -> ShowS
[CodeSizeDeterminators] -> ShowS
CodeSizeDeterminators -> String
(Int -> CodeSizeDeterminators -> ShowS)
-> (CodeSizeDeterminators -> String)
-> ([CodeSizeDeterminators] -> ShowS)
-> Show CodeSizeDeterminators
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> CodeSizeDeterminators -> ShowS
showsPrec :: Int -> CodeSizeDeterminators -> ShowS
$cshow :: CodeSizeDeterminators -> String
show :: CodeSizeDeterminators -> String
$cshowList :: [CodeSizeDeterminators] -> ShowS
showList :: [CodeSizeDeterminators] -> ShowS
Show)
data ScenarioCodeMetrics = ScenarioCodeMetrics
{ ScenarioCodeMetrics -> Int
sourceTextLength :: Int
, ScenarioCodeMetrics -> Int
astSize :: Int
}
deriving (ScenarioCodeMetrics -> ScenarioCodeMetrics -> Bool
(ScenarioCodeMetrics -> ScenarioCodeMetrics -> Bool)
-> (ScenarioCodeMetrics -> ScenarioCodeMetrics -> Bool)
-> Eq ScenarioCodeMetrics
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ScenarioCodeMetrics -> ScenarioCodeMetrics -> Bool
== :: ScenarioCodeMetrics -> ScenarioCodeMetrics -> Bool
$c/= :: ScenarioCodeMetrics -> ScenarioCodeMetrics -> Bool
/= :: ScenarioCodeMetrics -> ScenarioCodeMetrics -> Bool
Eq, Eq ScenarioCodeMetrics
Eq ScenarioCodeMetrics =>
(ScenarioCodeMetrics -> ScenarioCodeMetrics -> Ordering)
-> (ScenarioCodeMetrics -> ScenarioCodeMetrics -> Bool)
-> (ScenarioCodeMetrics -> ScenarioCodeMetrics -> Bool)
-> (ScenarioCodeMetrics -> ScenarioCodeMetrics -> Bool)
-> (ScenarioCodeMetrics -> ScenarioCodeMetrics -> Bool)
-> (ScenarioCodeMetrics
-> ScenarioCodeMetrics -> ScenarioCodeMetrics)
-> (ScenarioCodeMetrics
-> ScenarioCodeMetrics -> ScenarioCodeMetrics)
-> Ord ScenarioCodeMetrics
ScenarioCodeMetrics -> ScenarioCodeMetrics -> Bool
ScenarioCodeMetrics -> ScenarioCodeMetrics -> Ordering
ScenarioCodeMetrics -> ScenarioCodeMetrics -> ScenarioCodeMetrics
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 :: ScenarioCodeMetrics -> ScenarioCodeMetrics -> Ordering
compare :: ScenarioCodeMetrics -> ScenarioCodeMetrics -> Ordering
$c< :: ScenarioCodeMetrics -> ScenarioCodeMetrics -> Bool
< :: ScenarioCodeMetrics -> ScenarioCodeMetrics -> Bool
$c<= :: ScenarioCodeMetrics -> ScenarioCodeMetrics -> Bool
<= :: ScenarioCodeMetrics -> ScenarioCodeMetrics -> Bool
$c> :: ScenarioCodeMetrics -> ScenarioCodeMetrics -> Bool
> :: ScenarioCodeMetrics -> ScenarioCodeMetrics -> Bool
$c>= :: ScenarioCodeMetrics -> ScenarioCodeMetrics -> Bool
>= :: ScenarioCodeMetrics -> ScenarioCodeMetrics -> Bool
$cmax :: ScenarioCodeMetrics -> ScenarioCodeMetrics -> ScenarioCodeMetrics
max :: ScenarioCodeMetrics -> ScenarioCodeMetrics -> ScenarioCodeMetrics
$cmin :: ScenarioCodeMetrics -> ScenarioCodeMetrics -> ScenarioCodeMetrics
min :: ScenarioCodeMetrics -> ScenarioCodeMetrics -> ScenarioCodeMetrics
Ord, Int -> ScenarioCodeMetrics -> ShowS
[ScenarioCodeMetrics] -> ShowS
ScenarioCodeMetrics -> String
(Int -> ScenarioCodeMetrics -> ShowS)
-> (ScenarioCodeMetrics -> String)
-> ([ScenarioCodeMetrics] -> ShowS)
-> Show ScenarioCodeMetrics
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ScenarioCodeMetrics -> ShowS
showsPrec :: Int -> ScenarioCodeMetrics -> ShowS
$cshow :: ScenarioCodeMetrics -> String
show :: ScenarioCodeMetrics -> String
$cshowList :: [ScenarioCodeMetrics] -> ShowS
showList :: [ScenarioCodeMetrics] -> ShowS
Show, ReadPrec [ScenarioCodeMetrics]
ReadPrec ScenarioCodeMetrics
Int -> ReadS ScenarioCodeMetrics
ReadS [ScenarioCodeMetrics]
(Int -> ReadS ScenarioCodeMetrics)
-> ReadS [ScenarioCodeMetrics]
-> ReadPrec ScenarioCodeMetrics
-> ReadPrec [ScenarioCodeMetrics]
-> Read ScenarioCodeMetrics
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS ScenarioCodeMetrics
readsPrec :: Int -> ReadS ScenarioCodeMetrics
$creadList :: ReadS [ScenarioCodeMetrics]
readList :: ReadS [ScenarioCodeMetrics]
$creadPrec :: ReadPrec ScenarioCodeMetrics
readPrec :: ReadPrec ScenarioCodeMetrics
$creadListPrec :: ReadPrec [ScenarioCodeMetrics]
readListPrec :: ReadPrec [ScenarioCodeMetrics]
Read, (forall x. ScenarioCodeMetrics -> Rep ScenarioCodeMetrics x)
-> (forall x. Rep ScenarioCodeMetrics x -> ScenarioCodeMetrics)
-> Generic ScenarioCodeMetrics
forall x. Rep ScenarioCodeMetrics x -> ScenarioCodeMetrics
forall x. ScenarioCodeMetrics -> Rep ScenarioCodeMetrics x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. ScenarioCodeMetrics -> Rep ScenarioCodeMetrics x
from :: forall x. ScenarioCodeMetrics -> Rep ScenarioCodeMetrics x
$cto :: forall x. Rep ScenarioCodeMetrics x -> ScenarioCodeMetrics
to :: forall x. Rep ScenarioCodeMetrics x -> ScenarioCodeMetrics
Generic, [ScenarioCodeMetrics] -> Value
[ScenarioCodeMetrics] -> Encoding
ScenarioCodeMetrics -> Bool
ScenarioCodeMetrics -> Value
ScenarioCodeMetrics -> Encoding
(ScenarioCodeMetrics -> Value)
-> (ScenarioCodeMetrics -> Encoding)
-> ([ScenarioCodeMetrics] -> Value)
-> ([ScenarioCodeMetrics] -> Encoding)
-> (ScenarioCodeMetrics -> Bool)
-> ToJSON ScenarioCodeMetrics
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> (a -> Bool)
-> ToJSON a
$ctoJSON :: ScenarioCodeMetrics -> Value
toJSON :: ScenarioCodeMetrics -> Value
$ctoEncoding :: ScenarioCodeMetrics -> Encoding
toEncoding :: ScenarioCodeMetrics -> Encoding
$ctoJSONList :: [ScenarioCodeMetrics] -> Value
toJSONList :: [ScenarioCodeMetrics] -> Value
$ctoEncodingList :: [ScenarioCodeMetrics] -> Encoding
toEncodingList :: [ScenarioCodeMetrics] -> Encoding
$comitField :: ScenarioCodeMetrics -> Bool
omitField :: ScenarioCodeMetrics -> Bool
ToJSON, Maybe ScenarioCodeMetrics
Value -> Parser [ScenarioCodeMetrics]
Value -> Parser ScenarioCodeMetrics
(Value -> Parser ScenarioCodeMetrics)
-> (Value -> Parser [ScenarioCodeMetrics])
-> Maybe ScenarioCodeMetrics
-> FromJSON ScenarioCodeMetrics
forall a.
(Value -> Parser a)
-> (Value -> Parser [a]) -> Maybe a -> FromJSON a
$cparseJSON :: Value -> Parser ScenarioCodeMetrics
parseJSON :: Value -> Parser ScenarioCodeMetrics
$cparseJSONList :: Value -> Parser [ScenarioCodeMetrics]
parseJSONList :: Value -> Parser [ScenarioCodeMetrics]
$comittedField :: Maybe ScenarioCodeMetrics
omittedField :: Maybe ScenarioCodeMetrics
FromJSON)
codeMetricsFromSyntax ::
Data a =>
Syntax' a ->
ScenarioCodeMetrics
codeMetricsFromSyntax :: forall a. Data a => Syntax' a -> ScenarioCodeMetrics
codeMetricsFromSyntax s :: Syntax' a
s@(Syntax' SrcLoc
srcLoc Term' a
_ Comments
_ a
_) =
Int -> Int -> ScenarioCodeMetrics
ScenarioCodeMetrics (SrcLoc -> Int
charCount SrcLoc
srcLoc) (Syntax' a -> Int
forall a. Data a => Syntax' a -> Int
measureAstSize Syntax' a
s)
where
charCount :: SrcLoc -> Int
charCount :: SrcLoc -> Int
charCount SrcLoc
NoLoc = Int
0
charCount (SrcLoc Int
start Int
end) = Int
end Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
start
codeSizeFromDeterminator :: CodeSizeDeterminators -> Maybe ScenarioCodeMetrics
codeSizeFromDeterminator :: CodeSizeDeterminators -> Maybe ScenarioCodeMetrics
codeSizeFromDeterminator (CodeSizeDeterminators Maybe Syntax
maybeInitialCode Bool
usedRepl) = do
Bool -> Maybe ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (Bool -> Maybe ()) -> Bool -> Maybe ()
forall a b. (a -> b) -> a -> b
$ Bool -> Bool
not Bool
usedRepl
Syntax -> ScenarioCodeMetrics
forall a. Data a => Syntax' a -> ScenarioCodeMetrics
codeMetricsFromSyntax (Syntax -> ScenarioCodeMetrics)
-> Maybe Syntax -> Maybe ScenarioCodeMetrics
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Syntax
maybeInitialCode