packages feed

SCalendar-1.0.0: test/SCalendarTest/Constructors.hs

module SCalendarTest.Constructors where


import Time.SCalendar.Operations (augmentCalendar)
import SCalendarTest.Helpers (startDay)
import Data.Maybe (fromMaybe)
import Time.SCalendar.Internal ( daysBetween
                               , getInterval )
import Time.SCalendar.Types ( SCalendar(..)
                            , powerOfTwo
                            , createCalendar
                            , getFrom
                            , getTo       )
import qualified Data.Set as S (empty)


calendarSizePowerOfTwo :: Int -> Bool
calendarSizePowerOfTwo n = fromMaybe False $ do
  let (year, month, day) = startDay
      size = if n > 1 then n else abs n + 2
  calendar <- createCalendar year month day size
  let i = getInterval calendar
  return $ daysBetween (getFrom i) (getTo i) == 2 ^ powerOfTwo size

augmentedCalendarPowerOfKPlusN :: Int -> Int -> Bool
augmentedCalendarPowerOfKPlusN n k = fromMaybe False $ do
  let (year, month, day) = startDay
      n' = powerOfTwo n
      k' = powerOfTwo k
  calendar <- createCalendar year month day n'
  (SCalendar _ calendar') <- augmentCalendar (SCalendar S.empty calendar) k'
  let i = getInterval calendar
      j = getInterval calendar'
  return $ daysBetween (getFrom j) (getTo j) == daysBetween (getFrom i) (getTo i) * (2 ^ k')