timerep 1.0.0 → 1.0.2
raw patch · 4 files changed
+256/−236 lines, 4 files
Files
- Data/Time/RFC2822.hs +111/−99
- Data/Time/RFC3339.hs +85/−82
- LICENSE +20/−20
- timerep.cabal +40/−35
Data/Time/RFC2822.hs view
@@ -1,99 +1,111 @@-{-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-}--- | --- Module : Data.Time.RFC2822--- Copyright : (c) 2011 Hugo Daniel Gomes------ License : BSD-style--- Maintainer : mr.hugo.gomes@gmail.com--- Stability : experimental--- Portability : GHC------ Support for reading and displaying time in the format specified by --- the RFC2822 <http://www.ietf.org/rfc/rfc2822.txt> section 3.3------ Example of usage:--- >--- > import Data.Time.LocalTime--- >--- > showTime :: IO String--- > showTime = getZonedTime >>= return . showRFC2822--- >--- > example1 = "Fri, 21 Nov 1997 09:55:06 -0600"--- > example2 = "Tue, 15 Nov 1994 12:45:26 GMT"--- > example3 = "Tue, 1 Jul 2003 10:52:37 +0200"--- > example4 = "Thu, 13 Feb 1969 23:32:54 -0330"--- > example5 = "Mon, 24 Nov 1997 14:22:01 -0800"--- > example6 = "Thu, 13\n Feb\n 1969\n 23:32\n -0330"--- > example7 = "Thu, 13\n Feb\n 1969\n 23:32\n -0330 (Newfoundland Time)"--- > example8 = "24 Nov 1997 14:22:01 -0800"--- > examples = [example1,example2,example3,example4,example5,example6,example7,example8]--- >--- > readAll = map readRFC2822 examples--module Data.Time.RFC2822 (- -- * Basic type class- -- $basic- RFC2822(showRFC2822, readRFC2822)-) where--import Data.Time.Format-import Data.Time.LocalTime-import Data.Time.Calendar-import Data.Maybe -import System.Locale--test1 = "Fri, 21 Nov 1997 09:55:06 -0600"-test2 = "Tue, 15 Nov 1994 12:45:26 GMT"-test3 = "Tue, 1 Jul 2003 10:52:37 +0200"-test4 = "Thu, 13 Feb 1969 23:32:54 -0330"-test5 = "Mon, 24 Nov 1997 14:22:01 -0800"-test6 = "Thu, 13\n Feb\n 1969\n 23:32\n -0330"-test7 = "Thu, 13\n Feb\n 1969\n 23:32\n -0330 (Newfoundland Time)"-test8 = "24 Nov 1997 14:22:01 -0800"-test9 = "15 Nov 1994 12:45:26 GMT"-test10 = "Mon,24 Nov 1997 14:22:01 -0800"-test11 = "Thu,\t13\n Feb\n 1969\n 23:32\n -0330 (Newfoundland Time)"-tests = [test1, test2, test3, test4, test5, test6, test7, test8, test9, test10- , test11]-testParse = length (catMaybes (map readRFC2822 tests)) == length tests---- ------------------------------------------------------------------------------- The RFC2822 class definition---- | This class is here to allow future support for other data types --- like Data.Text or Data.ByteString if that becomes necessary-class RFC2822 a where- showRFC2822 :: ZonedTime -> a- readRFC2822 :: a -> Maybe ZonedTime---- | For now there is only an instance for the String data type-instance RFC2822 String where- showRFC2822 zt@(ZonedTime lt z) = - formatTime defaultTimeLocale "%a, %e %b %Y %T" zt ++ printZone- where- timeZoneStr = timeZoneOffsetString z- printZone = if timeZoneStr == timeZoneOffsetString utc- then " GMT"- else " " ++ timeZoneStr-- readRFC2822 t = foldr (tryP t') Nothing [ p "%a, %e %b %Y %T GMT"- , p "%a, %e %b %Y %T %z"- , p "%e %b %Y %T GMT"- , p "%e %b %Y %T %z"- -- , p "%FT%T%QZ"- ]- where - p :: String -> String -> Maybe ZonedTime- p f s = parseTime defaultTimeLocale f s-- tryP :: String -> (String -> Maybe a) -> Maybe a -> Maybe a- tryP s f acc | isJust acc = acc- | otherwise = f s-- -- t' is a trimmed t (currently only \n is trimmed)- -- TODO: trim other white space characters - t' :: String- t' = lines t >>= ("" ++)--showTime :: IO String-showTime = getZonedTime >>= return . showRFC2822+{-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-} +-- | +-- Module : Data.Time.RFC2822 +-- Copyright : (c) 2011 Hugo Daniel Gomes +-- +-- License : BSD-style +-- Maintainer : mr.hugo.gomes@gmail.com +-- Stability : experimental +-- Portability : GHC +-- +-- Support for reading and displaying time in the format specified by +-- the RFC2822 <http://www.ietf.org/rfc/rfc2822.txt> section 3.3 +-- +-- Example of usage: +-- > +-- > import Data.Time.LocalTime +-- > +-- > showTime :: IO String +-- > showTime = getZonedTime >>= return . showRFC2822 +-- > +-- > example1 = "Fri, 21 Nov 1997 09:55:06 -0600" +-- > example2 = "Tue, 15 Nov 1994 12:45:26 GMT" +-- > example3 = "Tue, 1 Jul 2003 10:52:37 +0200" +-- > example4 = "Thu, 13 Feb 1969 23:32:54 -0330" +-- > example5 = "Mon, 24 Nov 1997 14:22:01 -0800" +-- > example6 = "Thu, 13\n Feb\n 1969\n 23:32\n -0330" +-- > example7 = "Thu, 13\n Feb\n 1969\n 23:32\n -0330 (Newfoundland Time)" +-- > example8 = "24 Nov 1997 14:22:01 -0800" +-- > examples = [example1,example2,example3,example4,example5,example6,example7,example8] +-- > +-- > readAll = map readRFC2822 examples + +module Data.Time.RFC2822 ( + -- * Basic type class + -- $basic + RFC2822(showRFC2822, readRFC2822) +) where + +import Data.Time.Format +import Data.Time.LocalTime +import Data.Time.Calendar +import Data.Maybe +import System.Locale +import qualified Data.Attoparsec.Text as A +import Data.Attoparsec.Text +import qualified Data.Attoparsec.Combinator as AC + +test1 = "Fri, 21 Nov 1997 09:55:06 -0600" +test2 = "Tue, 15 Nov 1994 12:45:26 GMT" +test3 = "Tue, 1 Jul 2003 10:52:37 +0200" +test4 = "Thu, 13 Feb 1969 23:32:54 -0330" +test5 = "Mon, 24 Nov 1997 14:22:01 -0800" +test6 = "Thu, 13\n Feb\n 1969\n 23:32\n -0330" +test7 = "Thu, 13\n Feb\n 1969\n 23:32\n -0330 (Newfoundland Time)" -- Fails +test8 = "24 Nov 1997 14:22:01 -0800" +test9 = "15 Nov 1994 12:45:26 GMT" +test10 = "Mon,24 Nov 1997 14:22:01 -0800" +test11 = "Thu,\t13\n Feb\n 1969\n 23:32\n -0330 (Newfoundland Time)" -- Fails +test12 = "Thu, 13 Feb 1969 23:32 -0330 (Newfoundland Time)" -- Fails +tests :: [String] +tests = [test1, test2, test3, test4, test5, test6, test7, test8, test9, test10 + , test11, test12] +testParse = length (catMaybes (map readRFC2822 tests)) == length tests + +-- ---------------------------------------------------------------------------- +-- The RFC2822 class definition + +-- | This class is here to allow future support for other data types +-- like Data.Text or Data.ByteString if that becomes necessary +class RFC2822 a where + showRFC2822 :: ZonedTime -> a + readRFC2822 :: a -> Maybe ZonedTime + formatRFC2822 :: [a] + +-- | For now there is only an instance for the String data type +instance RFC2822 String where + showRFC2822 zt@(ZonedTime lt z) = + formatTime defaultTimeLocale "%a, %e %b %Y %T" zt ++ printZone + where + timeZoneStr = timeZoneOffsetString z + printZone = if timeZoneStr == timeZoneOffsetString utc + then " GMT" + else " " ++ timeZoneStr + + formatRFC2822 = [ "%a, %e %b %Y %T GMT" + , "%a, %e %b %Y %T %z" + , "%e %b %Y %T GMT" + , "%e %b %Y %T %z" + -- Support for hours:minutes + , "%a, %e %b %Y %R GMT" + , "%a, %e %b %Y %R %z" + , "%e %b %Y %R GMT" + , "%e %b %Y %R %z" + ] + + readRFC2822 t = foldr (tryP t') Nothing $ map p formatRFC2822 + where + p :: String -> String -> Maybe ZonedTime + p f s = parseTime defaultTimeLocale f s + + tryP :: String -> (String -> Maybe a) -> Maybe a -> Maybe a + tryP s f acc | isJust acc = acc + | otherwise = f s + + -- t' is a trimmed t (currently only \n is trimmed) + -- TODO: trim other white space characters + t' :: String + t' = lines t >>= ("" ++) + +showTime :: IO String +showTime = getZonedTime >>= return . showRFC2822
Data/Time/RFC3339.hs view
@@ -1,82 +1,85 @@-{-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-}--- | --- Module : Data.Time.RFC3339--- Copyright : (c) 2011 Hugo Daniel Gomes------ License : BSD-style--- Maintainer : mr.hugo.gomes@gmail.com--- Stability : experimental--- Portability : GHC------ Support for reading and displaying time in the format specified by --- the RFC3339 <http://www.ietf.org/rfc/rfc3339.txt>------ Example of usage:--- >--- > import Data.Time.LocalTime--- >--- > showTime :: IO String--- > showTime = getZonedTime >>= return . showRFC3339--- >--- > example1 = "1985-04-12T23:20:50.52Z"--- > example2 = "1996-12-19T16:39:57-08:00"--- > example3 = "1990-12-31T23:59:60Z"--- > example4 = "1990-12-31T15:59:60-08:00"--- > example5 = "1937-01-01T12:00:27.87+00:20"--- > examples = [example1,example2,example3,example4,example5]--- >--- > readAll = map readRFC3339 examples--module Data.Time.RFC3339 (- -- * Basic type class- -- $basic- RFC3339(showRFC3339, readRFC3339)-) where--import Data.Time.Format-import Data.Time.LocalTime-import Data.Time.Calendar-import Data.Maybe -import System.Locale--test1 = "1985-04-12T23:20:50.52Z"-test2 = "1996-12-19T16:39:57-08:00"-test3 = "1990-12-31T23:59:60Z"-test4 = "1990-12-31T15:59:60-08:00"-test5 = "1937-01-01T12:00:27.87+00:20"-tests = [test1, test2, test3, test4, test5]-testParse = length (catMaybes (map readRFC3339 tests)) == length tests---- ------------------------------------------------------------------------------- The RFC3339 class definition---- | This class is here to allow future support for other data types --- like Data.Text or Data.ByteString if that becomes necessary-class RFC3339 a where- showRFC3339 :: ZonedTime -> a- readRFC3339 :: a -> Maybe ZonedTime---- | For now there is only an instance for the String data type-instance RFC3339 String where- showRFC3339 zt@(ZonedTime lt z) = - formatTime defaultTimeLocale "%FT%T" zt ++ printZone- where- timeZoneStr = timeZoneOffsetString z- printZone = if timeZoneStr == timeZoneOffsetString utc- then "Z"- else take 3 timeZoneStr ++ ":" ++ drop 3 timeZoneStr- readRFC3339 t = foldr (tryP t) Nothing [ p "%FT%TZ"- , p "%FT%T%z"- , p "%FT%T%Q%z"- , p "%FT%T%QZ"- ]- where - p :: String -> String -> Maybe ZonedTime- p f s = parseTime defaultTimeLocale f s-- tryP :: String -> (String -> Maybe a) -> Maybe a -> Maybe a- tryP s f acc | isJust acc = acc- | otherwise = f s--showTime :: IO String-showTime = getZonedTime >>= return . showRFC3339+{-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-} +-- | +-- Module : Data.Time.RFC3339 +-- Copyright : (c) 2011 Hugo Daniel Gomes +-- +-- License : BSD-style +-- Maintainer : mr.hugo.gomes@gmail.com +-- Stability : experimental +-- Portability : GHC +-- +-- Support for reading and displaying time in the format specified by +-- the RFC3339 <http://www.ietf.org/rfc/rfc3339.txt> +-- +-- Example of usage: +-- > +-- > import Data.Time.LocalTime +-- > +-- > showTime :: IO String +-- > showTime = getZonedTime >>= return . showRFC3339 +-- > +-- > example1 = "1985-04-12T23:20:50.52Z" +-- > example2 = "1996-12-19T16:39:57-08:00" +-- > example3 = "1990-12-31T23:59:60Z" +-- > example4 = "1990-12-31T15:59:60-08:00" +-- > example5 = "1937-01-01T12:00:27.87+00:20" +-- > examples = [example1,example2,example3,example4,example5] +-- > +-- > readAll = map readRFC3339 examples + +module Data.Time.RFC3339 ( + -- * Basic type class + -- $basic + RFC3339(showRFC3339, readRFC3339) +) where + +import Data.Time.Format +import Data.Time.LocalTime +import Data.Time.Calendar +import Data.Maybe +import System.Locale + +test1 = "1985-04-12T23:20:50.52Z" +test2 = "1996-12-19T16:39:57-08:00" +test3 = "1990-12-31T23:59:60Z" +test4 = "1990-12-31T15:59:60-08:00" +test5 = "1937-01-01T12:00:27.87+00:20" +tests :: [String] +tests = [test1, test2, test3, test4, test5] +testParse = length (catMaybes (map readRFC3339 tests)) == length tests + +-- ---------------------------------------------------------------------------- +-- The RFC3339 class definition + +-- | This class is here to allow future support for other data types +-- like Data.Text or Data.ByteString if that becomes necessary +class RFC3339 a where + showRFC3339 :: ZonedTime -> a + readRFC3339 :: a -> Maybe ZonedTime + formatRFC3339 :: [a] + +-- | For now there is only an instance for the String data type +instance RFC3339 String where + showRFC3339 zt@(ZonedTime lt z) = + formatTime defaultTimeLocale "%FT%T" zt ++ printZone + where + timeZoneStr = timeZoneOffsetString z + printZone = if timeZoneStr == timeZoneOffsetString utc + then "Z" + else take 3 timeZoneStr ++ ":" ++ drop 3 timeZoneStr + formatRFC3339 = [ "%FT%TZ" + , "%FT%T%z" + , "%FT%T%Q%z" + , "%FT%T%QZ" + ] + readRFC3339 t = foldr (tryP t) Nothing $ map p formatRFC3339 + where + p :: String -> String -> Maybe ZonedTime + p f s = parseTime defaultTimeLocale f s + + tryP :: String -> (String -> Maybe a) -> Maybe a -> Maybe a + tryP s f acc | isJust acc = acc + | otherwise = f s + +showTime :: IO String +showTime = getZonedTime >>= return . showRFC3339
LICENSE view
@@ -1,20 +1,20 @@-Copyright (c) 2010 Hugo Daniel H. O. Gomes <hugo.gomes@fcsh.unl.pt>--This software is provided 'as-is', without any express or implied-warranty. In no event will the authors be held liable for any damages-arising from the use of this software.--Permission is granted to anyone to use this software for any purpose,-including commercial applications, and to alter it and redistribute it-freely, subject to the following restrictions:--1. The origin of this software must not be misrepresented; you must not- claim that you wrote the original software. If you use this software- in a product, an acknowledgment in the product documentation would- be appreciated but is not required.--2. Altered source versions must be plainly marked as such, and must not- be misrepresented as being the original software.--3. This notice may not be removed or altered from any source- distribution.+Copyright (c) 2010 Hugo Daniel H. O. Gomes <hugo.gomes@fcsh.unl.pt> + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would + be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and must not + be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source + distribution.
timerep.cabal view
@@ -1,35 +1,40 @@-Name: timerep-Version: 1.0.0-Category: Web, Time-Synopsis: Parse and display time according to some RFCs (RFC3339, RFC2822)-Description: - .- Parse and display time according to some RFC's.- Supported: - RFC3339 <http://www.ietf.org/rfc/rfc3339.txt>- RFC2822 <http://www.ietf.org/rfc/rfc2822.txt>- .- This package defines a type class to parse and read time representations - specified in some RFC's.- Right now there is only support for reading and showing String- .-Build-type: Simple-Maintainer: Hugo Daniel Gomes <mr.hugo.gomes@gmail.com>-Author: Hugo Daniel Gomes <mr.hugo.gomes@gmail.com>-Copyright: Hugo Daniel Gomes-Cabal-version: >= 1.6-License: BSD3-License-file: LICENSE-source-repository head - type: git - location: git://github.com/HugoDaniel/RFC3339.git--library- build-depends:- base < 5, time >= 1.2, old-locale-- exposed-modules:- Data.Time.RFC3339- Data.Time.RFC2822-- extensions: TypeSynonymInstances+Name: timerep +Version: 1.0.2 +Category: Web, Time +Synopsis: Parse and display time according to some RFCs (RFC3339, RFC2822) +Description: + . + Parse and display time according to some RFC's. + Supported: + RFC3339 <http://www.ietf.org/rfc/rfc3339.txt> + RFC2822 <http://www.ietf.org/rfc/rfc2822.txt> + . + This package defines a type class to parse and read time representations + specified in some RFC's. + Right now there is only support for reading and showing String + . + Special thanks to Koral for all the suggestions and help in solving some bugs + . +Build-type: Simple +Maintainer: Hugo Daniel Gomes <mr.hugo.gomes@gmail.com> +Author: Hugo Daniel Gomes <mr.hugo.gomes@gmail.com> +Copyright: Hugo Daniel Gomes +Cabal-version: >= 1.6 +License: BSD3 +License-file: LICENSE +source-repository head + type: git + location: git://github.com/HugoDaniel/RFC3339.git + +library + build-depends: + base < 5, + time >= 1.2, + old-locale + + exposed-modules: + Data.Time.RFC3339 + Data.Time.RFC2822 + + extensions: TypeSynonymInstances FlexibleInstances +