packages feed

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)