@@ -32,6 +32,9 @@ module Data.Time.LocalTime.TimeZone.Olson.Render
34import Data.Time.LocalTime.TimeZone.Olson.Types
34import Data.Time.LocalTime.TimeZone.Olson.Types
35+import Data.Time.LocalTime.TimeZone.Series (TimeZoneSeries(TimeZoneSeries))
36+import Data.Time (TimeZone(TimeZone, timeZoneSummerOnly, timeZoneName))
37+import Data.Time.Clock.POSIX (utcTimeToPOSIXSeconds)
35import Data.Binary.Put (Put, runPut, putByteString, putWord8, flush,
38import Data.Binary.Put (Put, runPut, putByteString, putWord8, flush,
36 putWord32be, putWord64be)
39 putWord32be, putWord64be)
37import qualified Data.ByteString as B
40import qualified Data.ByteString as B
@@ -39,10 +42,37 @@ import qualified Data.ByteString.Lazy as L
39import Data.List (partition, sortBy, sort, group)
42import Data.List (partition, sortBy, sort, group)
40import Data.Ord (comparing)
43import Data.Ord (comparing)
41import Data.Word (Word8)
44import Data.Word (Word8)
42−import Data.Maybe (listToMaybe, maybeToList, isNothing, fromMaybe)
45+import Data.Maybe (listToMaybe, maybeToList, isNothing, fromMaybe, catMaybes)
43import Data.Monoid (mempty)
46import Data.Monoid (mempty)
44import Control.Monad (guard, replicateM_)
47import Control.Monad (guard, replicateM_)
49+-- | Render a @TimeZoneSeries@ as a binary Olson timezone file.
50+renderTimeZoneSeriesToOlsonFile :: FilePath -> TimeZoneSeries -> IO ()
51+renderTimeZoneSeriesToOlsonFile fp = renderOlsonToFile fp .
52+ fromMaybe (error "Cannot render TimeZoneSeries: default is summer time") .
53+ timeZoneSeriesToOlson
55+-- | Convert a @TimeZoneSeries@ to @OlsonData@ for rendering.
56+timeZoneSeriesToOlson :: TimeZoneSeries -> Maybe OlsonData
57+timeZoneSeriesToOlson (TimeZoneSeries dflt pairs)
58+ | timeZoneSummerOnly dflt && not (all timeZoneSummerOnly $ map snd pairs)
62+ [Transition secs ttinfo |
64+ let secs = round $ utcTimeToPOSIXSeconds t,
65+ ttinfo <- maybeToList $ lookup (mkTT tzs) ttAssocs]
70+ mkTT (TimeZone offset issdst abbr) =
71+ TtInfo (offset*60) issdst Wall abbr
73+ ttAssocs = (dfltTT, 0) :
74+ zip (filter (/= dfltTT) $ map (mkTT . snd) pairs) [1..]
75+ ttinfos = map fst ttAssocs
47-- | Render Olson timezone data as a binary Olson timezone file
77-- | Render Olson timezone data as a binary Olson timezone file
48renderOlsonToFile :: FilePath -> OlsonData -> IO ()
78renderOlsonToFile :: FilePath -> OlsonData -> IO ()