timerep 1.0.3 → 1.0.4
raw patch · 4 files changed
+263/−253 lines, 4 filesdep +attoparsec
Dependencies added: attoparsec
Files
- Data/Time/RFC2822.hs +114/−108
- Data/Time/RFC3339.hs +88/−85
- LICENSE +20/−20
- timerep.cabal +41/−40
Data/Time/RFC2822.hs view
@@ -1,108 +1,114 @@-{-# 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)" -- 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 +{-# LANGUAGE CPP, 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++#if __GLASGOW_HASKELL__ < 710+import System.Locale+#endif++import Data.Time.Format+import Data.Time.LocalTime+import Data.Time.Calendar+import Data.Maybe +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,85 +1,88 @@-{-# 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 +{-# LANGUAGE CPP, 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++#if __GLASGOW_HASKELL__ < 710+import System.Locale+#endif++import Data.Time.Format+import Data.Time.LocalTime+import Data.Time.Calendar+import Data.Maybe ++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,40 +1,41 @@-Name: timerep -Version: 1.0.3 -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 - +Name: timerep+Version: 1.0.4+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, + attoparsec,+ old-locale++ exposed-modules:+ Data.Time.RFC3339+ Data.Time.RFC2822++ extensions: TypeSynonymInstances FlexibleInstances+