Sha256: fbbcb6173cc76fb6a5ef1495e22697a7de3b285d392d7ce39b2978093717c129

Contents?: true

Size: 1.35 KB

Versions: 396

Compression:

Stored size: 1.35 KB

Contents

module Meetup (Weekday(..), Schedule(..), meetupDay) where
import Data.Time.Calendar (Day, addDays, fromGregorian, addGregorianMonthsClip)
import Data.Time.Calendar.WeekDate (toWeekDate)

data Weekday = Monday
             | Tuesday
             | Wednesday
             | Thursday
             | Friday
             | Saturday
             | Sunday
             deriving (Enum)

data Schedule = First
              | Second
              | Third
              | Fourth
              | Last
              | Teenth
              deriving (Enum)

type Year = Integer
type Month = Int

addWeeks :: Int -> Day -> Day
addWeeks = addDays . (7 *) . fromIntegral

weekdayNum :: Weekday -> Int
weekdayNum = succ . fromEnum

toWeekday :: Weekday -> Day -> Day
toWeekday w d = fromIntegral offset `addDays` d
  where offset | wnum >= wd = wnum - wd
               | otherwise  = 7 + wnum - wd
        wnum = weekdayNum w
        (_, _, wd) = toWeekDate d

meetupDay :: Schedule -> Weekday -> Year -> Month -> Day
meetupDay schedule weekday year month =
  case schedule of
    Last   -> (-1) `addWeeks` calcDay nextMonthStart
    Teenth -> calcDay $ 12 `addDays` monthStart
    enum   -> fromEnum enum `addWeeks` firstDay
  where
    calcDay = toWeekday weekday
    monthStart = fromGregorian year month 1
    nextMonthStart = addGregorianMonthsClip 1 monthStart
    firstDay = calcDay monthStart

Version data entries

396 entries across 396 versions & 1 rubygems

Version Path
trackler-2.2.1.180 tracks/haskell/exercises/meetup/examples/success-standard/src/Meetup.hs
trackler-2.2.1.179 tracks/haskell/exercises/meetup/examples/success-standard/src/Meetup.hs
trackler-2.2.1.178 tracks/haskell/exercises/meetup/examples/success-standard/src/Meetup.hs
trackler-2.2.1.177 tracks/haskell/exercises/meetup/examples/success-standard/src/Meetup.hs
trackler-2.2.1.176 tracks/haskell/exercises/meetup/examples/success-standard/src/Meetup.hs
trackler-2.2.1.175 tracks/haskell/exercises/meetup/examples/success-standard/src/Meetup.hs
trackler-2.2.1.174 tracks/haskell/exercises/meetup/examples/success-standard/src/Meetup.hs
trackler-2.2.1.173 tracks/haskell/exercises/meetup/examples/success-standard/src/Meetup.hs
trackler-2.2.1.172 tracks/haskell/exercises/meetup/examples/success-standard/src/Meetup.hs
trackler-2.2.1.171 tracks/haskell/exercises/meetup/examples/success-standard/src/Meetup.hs
trackler-2.2.1.170 tracks/haskell/exercises/meetup/examples/success-standard/src/Meetup.hs
trackler-2.2.1.169 tracks/haskell/exercises/meetup/examples/success-standard/src/Meetup.hs
trackler-2.2.1.167 tracks/haskell/exercises/meetup/examples/success-standard/src/Meetup.hs
trackler-2.2.1.166 tracks/haskell/exercises/meetup/examples/success-standard/src/Meetup.hs
trackler-2.2.1.165 tracks/haskell/exercises/meetup/examples/success-standard/src/Meetup.hs
trackler-2.2.1.164 tracks/haskell/exercises/meetup/examples/success-standard/src/Meetup.hs
trackler-2.2.1.163 tracks/haskell/exercises/meetup/examples/success-standard/src/Meetup.hs
trackler-2.2.1.162 tracks/haskell/exercises/meetup/examples/success-standard/src/Meetup.hs
trackler-2.2.1.161 tracks/haskell/exercises/meetup/examples/success-standard/src/Meetup.hs
trackler-2.2.1.160 tracks/haskell/exercises/meetup/examples/success-standard/src/Meetup.hs