-- | AST for conditional restrictions and incomplete AST for opening hours.
module ConditionalRestriction.Parse.AST
( Token,
ConditionalRestriction (..),
Expression (..),
Condition (..),
ComparisonOp (..),
OpeningHours (..),
OHState,
RuleType (..),
RuleSequence (..),
WeekdaySelector,
TimeSelector,
SelectorSequence (..),
WeekdayRange (..),
TimeSpan (..),
)
where
import Data.Hourglass (TimeOfDay, WeekDay)
-- | A single token. Is used to represent values of any kind that the parser does not touch.
type Token = String
-- | AST representation of a conditional restriction.
newtype ConditionalRestriction = ConditionalRestriction [Expression]
deriving (Eq, Show)
-- | AST representation of a conditional restriction expression, containing a value and conditions for that value
data Expression
= Expression
Token
-- ^ The value
[Condition]
-- ^ The conditions. All conditions must be met when evaluating.
deriving (Eq, Show)
-- | AST representation of a condition.
data Condition
= -- | An 'OpeningHours' condition. When evaluating, the given time must be within those opening hours.
OH OpeningHours
| -- | A comparison. Looks something like @"weight > 3.0"@
Comparison Token ComparisonOp Double
| -- | An absolute condition, e.g. @"wet"@, @"disabled"@.
Absolute Token
deriving (Eq, Show)
-- | A comparison operator.
data ComparisonOp = Gt | Lt | GtEq | LtEq | Eq
deriving (Eq, Show)
-- | AST representation of opening hours. Not complete.
newtype OpeningHours = OpeningHours [RuleSequence]
deriving (Eq, Show)
-- | Opening hour state. True\/False if known to be open/closed, Nothing if unknown.
type OHState = Maybe Bool
-- | Type of opening hour rule.
data RuleType
= -- | First rule or rules separated by ";".
Normal
| -- | Rules separated by ",".
Additional
deriving (Eq, Show)
-- | AST representation of a rule sequence.
data RuleSequence = RuleSequence RuleType SelectorSequence OHState
deriving (Eq, Show)
-- | AST representation of a weekday selector (e.g. @"Sa-Di, Th"@).
type WeekdaySelector = [WeekdayRange]
-- | AST representation of a time selector (e.g. @"18:00-20:00, 21:00-03:00"@).
type TimeSelector = [TimeSpan]
-- | AST representation of a selector sequence (e.g. @"24/7"@, @"We-Su 18:00-20:00"@).
data SelectorSequence
= TwentyFourSeven
| WeekdaySel WeekdaySelector
| TimeSel TimeSelector
| WeekdayTime WeekdaySelector TimeSelector
deriving (Eq, Show)
-- | AST representation of a weekday range.
data WeekdayRange
= SingleDay WeekDay
| WdayRange WeekDay WeekDay
deriving (Eq, Show)
-- | AST representation of time span.
data TimeSpan
= Moment TimeOfDay
| Span TimeOfDay TimeOfDay
deriving (Eq, Show)