{-# LANGUAGE GADTs #-}
{-# LANGUAGE NoRebindableSyntax #-}
{-# LANGUAGE OverloadedStrings #-}
module Duckling.Time.EN.AU.Rules
( rules
) where
import Data.Maybe
import Prelude
import Duckling.Dimensions.Types
import Duckling.Numeral.Helpers (parseInt)
import Duckling.Regex.Types
import Duckling.Time.Computed (easterSunday)
import Duckling.Time.Helpers
import Duckling.Time.Types (TimeData (..))
import Duckling.Types
import qualified Duckling.Time.Types as TTime
import qualified Duckling.TimeGrain.Types as TG
ruleDDMM :: Rule
ruleDDMM = Rule
{ name = "dd/mm"
, pattern =
[ regex "(3[01]|[12]\\d|0?[1-9])\\s?[/-]\\s?(1[0-2]|0?[1-9])"
]
, prod = \tokens -> case tokens of
(Token RegexMatch (GroupMatch (dd:mm:_)):_) -> do
d <- parseInt dd
m <- parseInt mm
tt $ monthDay m d
_ -> Nothing
}
ruleDDMMYYYY :: Rule
ruleDDMMYYYY = Rule
{ name = "dd/mm/yyyy"
, pattern =
[ regex "(3[01]|[12]\\d|0?[1-9])[-/\\s](1[0-2]|0?[1-9])[-/\\s](\\d{2,4})"
]
, prod = \tokens -> case tokens of
(Token RegexMatch (GroupMatch (dd:mm:yy:_)):_) -> do
y <- parseInt yy
d <- parseInt dd
m <- parseInt mm
tt $ yearMonthDay y m d
_ -> Nothing
}
ruleDDMMYYYYDot :: Rule
ruleDDMMYYYYDot = Rule
{ name = "dd.mm.yyyy"
, pattern =
[ regex "(3[01]|[12]\\d|0?[1-9])\\.(1[0-2]|0?[1-9])\\.(\\d{4})"
]
, prod = \tokens -> case tokens of
(Token RegexMatch (GroupMatch (dd:mm:yy:_)):_) -> do
y <- parseInt yy
d <- parseInt dd
m <- parseInt mm
tt $ yearMonthDay y m d
_ -> Nothing
}
rulePeriodicHolidays :: [Rule]
rulePeriodicHolidays = mkRuleHolidays
[ ( "ANZAC Day", "anzac day", monthDay 4 25 )
, ( "Australia Day", "(ana|anniversary|australia|foundation) day"
, monthDay 1 26 )
, ( "Harmony Day", "harmony day", monthDay 3 21 )
, ( "National Sorry Day", "national sorry day", monthDay 5 26 )
, ( "Queensland Day", "queensland day", monthDay 6 6 )
, ( "Remembrance Day", "remembrance day", monthDay 11 11 )
, ( "Take our Daughters and Sons to Work Day"
, "take our daughters and sons to work day", monthDay 1 5 )
, ( "Adelaide Cup", "adelaide cup", nthDOWOfMonth 2 1 3 )
, ( "Administrative Professionals' Day"
, "(administrative professional|secretarie|admin)('?s'?)? day"
, nthDOWOfMonth 1 5 5 )
, ( "Canberra Day", "canberra day", nthDOWOfMonth 2 1 3 )
, ( "Eight Hours Day", "eight hours day", nthDOWOfMonth 2 1 3 )
, ( "Father's Day", "father'?s?'? day", nthDOWOfMonth 1 7 9 )
, ( "Labour Day", "labour day", nthDOWOfMonth 1 1 10 )
, ( "Melbourne Cup Day", "melbourne cup day", nthDOWOfMonth 1 2 11 )
, ( "Mother's Day", "mother'?s?'? day", nthDOWOfMonth 2 7 5 )
, ( "National Close the Gap Day", "national close the gap day"
, nthDOWOfMonth 3 4 3 )
, ( "National Tree Day", "(arbor|national tree) day"
, predLastOf (dayOfWeek 7) (month 6) )
, ( "National Schools Tree Day", "national schools tree day"
, predLastOf (dayOfWeek 5) (month 6) )
, ( "New South Wales Bank Holiday", "new south wales bank holiday"
, nthDOWOfMonth 1 1 8 )
, ( "Picnic Day", "(northern territory )?picnic day", nthDOWOfMonth 1 1 8 )
, ( "Recreation Day", "recreation day", nthDOWOfMonth 1 1 10 )
, ( "Thanksgiving Day", "thanks?giving( day)?", nthDOWOfMonth 4 4 11 )
, ( "Western Australia Day", "western australia day", nthDOWOfMonth 1 1 6 )
, ( "Reconciliation Day", "reconciliation\\s+day"
, predNthAfter 0 (dayOfWeek 1) (monthDay 5 26) )
]
rulePeriodicHolidays' :: [Rule]
rulePeriodicHolidays' = mkRuleHolidays'
[ ( "NAIDOC Week"
, "(naidoc|national aboriginal and islander day observance committee) week"
, let fri = nthDOWOfMonth 2 5 7
start = cycleNthAfter False TG.Day (- 5) fri
end = cycleNthAfter False TG.Day 2 fri
in interval TTime.Open start end )
, ( "Royal Hobart Regatta", "royal hobart regatta"
, let end = nthDOWOfMonth 2 1 2
in interval TTime.Open (cycleNthAfter False TG.Day (- 2) end) end )
, ( "Royal Queensland Show Day"
, "(royal (national agricultural|queensland)|rna) show day|ekka day"
, let tentative = nthDOWOfMonth 1 5 8
alternative = nthDOWOfMonth 2 5 8
in do
forbidden <- interval TTime.Open (monthDay 8 1) (monthDay 8 4)
start <- intersectWithReplacement forbidden tentative alternative
return $ cycleNthAfter False TG.Day 5 start )
, ( "Royal Queensland Show"
, "ekka|(royal (national agricultural|queensland)|rna) show"
, let tentative = nthDOWOfMonth 1 5 8
alternative = nthDOWOfMonth 2 5 8
in do
forbidden <- interval TTime.Open (monthDay 8 1) (monthDay 8 4)
start <- intersectWithReplacement forbidden tentative alternative
interval TTime.Open start $ cycleNthAfter False TG.Day 9 start )
]
ruleComputedHolidays :: [Rule]
ruleComputedHolidays = mkRuleHolidays
[ ( "Easter Tuesday", "easter\\s+tue(sday)?"
, cycleNthAfter False TG.Day 2 easterSunday )
]
rules :: [Rule]
rules =
[ ruleDDMM
, ruleDDMMYYYY
, ruleDDMMYYYYDot
]
++ ruleComputedHolidays
++ rulePeriodicHolidays
++ rulePeriodicHolidays'