caliper-0.1.0.0: src/Caliper/Syntax/Ast.hs
{-# LANGUAGE DeriveGeneric #-}
module Caliper.Syntax.Ast where
import Control.DeepSeq
import Data.Function
import Data.List.NonEmpty qualified as NE
import Data.Map qualified as M
import Data.Text qualified as T
import Data.Time.Clock
import Data.Time.LocalTime
import GHC.Generics
import Caliper.Syntax.Position
-- TODO: (not urgent) not export the accessor and constructor
data RawAst = RawAst
{ rawAstCurrentFilePath :: T.Text {- FilePath -}
, rawAstTypeDecls :: [T.Text]
-- ^ type declarations
, rawAstEntriesOrTZ :: [EntriesOrTZ]
}
deriving (Show, Generic)
instance NFData RawAst
data EntriesOrTZ
= -- | allow user to specify a timezone to interpret the following entries
TZDecl TimeZone
| RawEntries [RawEntry]
deriving (Show, Generic)
instance NFData EntriesOrTZ
-- | Parsed data structure from the parser
data RawEntry = RawEntry
{ rawEntryStart :: LocalTime
, rawEntryEnd :: (LocalTime, SrcSpan)
, rawEntryMetadata :: M.Map T.Text (NE.NonEmpty (T.Text, SrcSpan))
}
deriving (Show, Generic)
instance NFData RawEntry
-- | Entry resolved enriched data
data ResolvedEntry = ResolvedEntry
{ entryStart :: ZonedTime
, entryEnd :: ZonedTime
, entryMetadata :: M.Map T.Text (NE.NonEmpty T.Text)
}
deriving (Show, Generic)
entrySpan :: ResolvedEntry -> NominalDiffTime
entrySpan e = (diffLocalTime `on` zonedTimeToLocalTime) (entryEnd e) (entryStart e)