{-# LANGUAGE BangPatterns #-}{-# LANGUAGE CPP #-}moduleData.Time.ToText(buildDay ,buildLocalTime ,buildTimeOfDay ,buildTimeZone ,buildUTCTime ,buildZonedTime ,buildYear ,buildMonth ,buildQuarter ,buildQuarterOfYear ,)whereimportData.Char(chr)importData.Fixed(Fixed(..))importData.Int(Int64)importData.Text.Lazy.Builder(Builder)importData.Time(TimeOfDay(..))importData.Time.Calendar(Day,toGregorian)importData.Time.Calendar.Compat(Year)importData.Time.Calendar.Month.Compat(Month,toYearMonth)importData.Time.Calendar.Quarter.Compat(Quarter,QuarterOfYear(..),toYearQuarter)importData.Time.Clock(UTCTime(..))importqualifiedData.Text.Lazy.BuilderasBimportqualifiedData.Text.Lazy.Builder.IntasB(decimal)importqualifiedData.Time.LocalTimeasLocal #if !MIN_VERSION_base(4,11,0) importData.Semigroup((<>)) #endif buildDay ::Day->BuilderbuildDay :: Day -> Builder buildDay Day dd =Year -> Builder buildYear Year yr Builder -> Builder -> Builder forall a. Semigroup a => a -> a -> a <>Char -> Builder char7 Char '-'Builder -> Builder -> Builder forall a. Semigroup a => a -> a -> a <>Int -> Builder digits2 Int m Builder -> Builder -> Builder forall a. Semigroup a => a -> a -> a <>Char -> Builder char7 Char '-'Builder -> Builder -> Builder forall a. Semigroup a => a -> a -> a <>Int -> Builder digits2 Int d where(Year yr ,Int m ,Int d )=Day -> (Year, Int, Int) toGregorianDay dd {-# INLINEbuildDay #-}buildMonth ::Month->BuilderbuildMonth :: Month -> Builder buildMonth Month mm =Year -> Builder buildYear Year yr Builder -> Builder -> Builder forall a. Semigroup a => a -> a -> a <>Char -> Builder char7 Char '-'Builder -> Builder -> Builder forall a. Semigroup a => a -> a -> a <>Int -> Builder digits2 Int m where(Year yr ,Int m )=Month -> (Year, Int) toYearMonthMonth mm {-# INLINEbuildMonth #-}buildQuarter ::Quarter->BuilderbuildQuarter :: Quarter -> Builder buildQuarter Quarter qq =Year -> Builder buildYear Year yr Builder -> Builder -> Builder forall a. Semigroup a => a -> a -> a <>Char -> Builder char7 Char '-'Builder -> Builder -> Builder forall a. Semigroup a => a -> a -> a <>QuarterOfYear -> Builder buildQuarterOfYear QuarterOfYear q where(Year yr ,QuarterOfYear q )=Quarter -> (Year, QuarterOfYear) toYearQuarterQuarter qq {-# INLINEbuildQuarter #-}buildQuarterOfYear ::QuarterOfYear->BuilderbuildQuarterOfYear :: QuarterOfYear -> Builder buildQuarterOfYear QuarterOfYear q =Char -> Builder char7 Char 'q'Builder -> Builder -> Builder forall a. Semigroup a => a -> a -> a <>caseQuarterOfYear q ofQuarterOfYear Q1->Char -> Builder char7 Char '1'QuarterOfYear Q2->Char -> Builder char7 Char '2'QuarterOfYear Q3->Char -> Builder char7 Char '3'QuarterOfYear Q4->Char -> Builder char7 Char '4'-- | Used in encoding day, month, quarterbuildYear ::Year->BuilderbuildYear :: Year -> Builder buildYear Year y |Year y Year -> Year -> Bool forall a. Ord a => a -> a -> Bool >=Year 1000=Year -> Builder forall a. Integral a => a -> Builder B.decimalYear y |Year y Year -> Year -> Bool forall a. Ord a => a -> a -> Bool >=Year 0=Year -> Builder forall a. Integral a => a -> Builder padYear Year y |Year y Year -> Year -> Bool forall a. Ord a => a -> a -> Bool >=-Year 999=Char -> Builder char7 Char '-'Builder -> Builder -> Builder forall a. Semigroup a => a -> a -> a <>Year -> Builder forall a. Integral a => a -> Builder padYear (Year -> Year forall a. Num a => a -> a negateYear y )|Bool otherwise=Year -> Builder forall a. Integral a => a -> Builder B.decimalYear y wherepadYear :: p -> Builder padYear p y' =let(Int ab ,Int c )=p -> Int forall a b. (Integral a, Num b) => a -> b fromIntegralp y' Int -> Int -> (Int, Int) forall a. Integral a => a -> a -> (a, a) `quotRem`Int 10(Int a ,Int b )=Int ab Int -> Int -> (Int, Int) forall a. Integral a => a -> a -> (a, a) `quotRem`Int 10inChar -> Builder char7 Char '0'Builder -> Builder -> Builder forall a. Semigroup a => a -> a -> a <>Int -> Builder digit Int a Builder -> Builder -> Builder forall a. Semigroup a => a -> a -> a <>Int -> Builder digit Int b Builder -> Builder -> Builder forall a. Semigroup a => a -> a -> a <>Int -> Builder digit Int c {-# INLINEbuildYear #-}buildTimeOfDay ::TimeOfDay->BuilderbuildTimeOfDay :: TimeOfDay -> Builder buildTimeOfDay (TimeOfDayInt h Int m (MkFixedYear s ))=Int -> Builder digits2 Int h Builder -> Builder -> Builder forall a. Semigroup a => a -> a -> a <>Char -> Builder char7 Char ':'Builder -> Builder -> Builder forall a. Semigroup a => a -> a -> a <>Int -> Builder digits2 Int m Builder -> Builder -> Builder forall a. Semigroup a => a -> a -> a <>Char -> Builder char7 Char ':'Builder -> Builder -> Builder forall a. Semigroup a => a -> a -> a <>Int -> Builder digits2 (Year -> Int forall a. Num a => Year -> a fromIntegerYear real )Builder -> Builder -> Builder forall a. Semigroup a => a -> a -> a <>Int64 -> Builder buildFrac (Year -> Int64 forall a. Num a => Year -> a fromIntegerYear frac )where(Year real ,Year frac )=Year s Year -> Year -> (Year, Year) forall a. Integral a => a -> a -> (a, a) `quotRem`Year pico buildFrac ::Int64->BuilderbuildFrac :: Int64 -> Builder buildFrac Int64 0=Builder forall a. Monoid a => a memptybuildFrac Int64 i =Char -> Builder char7 Char '.'Builder -> Builder -> Builder forall a. Semigroup a => a -> a -> a <>caseInt64 i Int64 -> Int64 -> (Int64, Int64) forall a. Integral a => a -> a -> (a, a) `quotRem`Int64 micro of(Int64 hi ,Int64 0)->Int64 -> Builder buildFrac6 Int64 hi (Int64 hi ,Int64 lo )->Int64 -> Builder digits6 Int64 hi Builder -> Builder -> Builder forall a. Semigroup a => a -> a -> a <>Int64 -> Builder buildFrac6 Int64 lo buildFrac6 ::Int64->BuilderbuildFrac6 :: Int64 -> Builder buildFrac6 Int64 i =caseInt64 i Int64 -> Int64 -> (Int64, Int64) forall a. Integral a => a -> a -> (a, a) `quotRem`Int64 milli of(Int64 hi ,Int64 0)->Int64 -> Builder digits3 Int64 hi (Int64 hi ,Int64 lo )->Int64 -> Builder digits3 Int64 hi Builder -> Builder -> Builder forall a. Semigroup a => a -> a -> a <>Int64 -> Builder digits3 Int64 lo digits6 :: Int64 -> Builder digits6 Int64 i =caseInt64 i Int64 -> Int64 -> (Int64, Int64) forall a. Integral a => a -> a -> (a, a) `quotRem`Int64 milli of(Int64 hi ,Int64 lo )->Int64 -> Builder digits3 Int64 hi Builder -> Builder -> Builder forall a. Semigroup a => a -> a -> a <>Int64 -> Builder digits3 Int64 lo digits3 :: Int64 -> Builder digits3 Int64 i =Int64 -> Builder digit64 Int64 a Builder -> Builder -> Builder forall a. Semigroup a => a -> a -> a <>Int64 -> Builder digit64 Int64 b Builder -> Builder -> Builder forall a. Semigroup a => a -> a -> a <>Int64 -> Builder digit64 Int64 c where(Int64 ab ,Int64 c )=Int64 i Int64 -> Int64 -> (Int64, Int64) forall a. Integral a => a -> a -> (a, a) `quotRem`Int64 10(Int64 a ,Int64 b )=Int64 ab Int64 -> Int64 -> (Int64, Int64) forall a. Integral a => a -> a -> (a, a) `quotRem`Int64 10pico :: Year pico =Year 1000000000000-- number of picoseconds in 1 secondmicro :: Int64 micro =Int64 1000000-- number of microseconds in 1 secondmilli :: Int64 milli =Int64 1000-- number of milliseconds in 1 second{-# INLINEbuildTimeOfDay #-}buildTimeZone ::Local.TimeZone->BuilderbuildTimeZone :: TimeZone -> Builder buildTimeZone (Local.TimeZoneInt off Bool _String _)|Int off Int -> Int -> Bool forall a. Eq a => a -> a -> Bool ==Int 0=Char -> Builder char7 Char 'Z'|Bool otherwise=Char -> Builder char7 Char s Builder -> Builder -> Builder forall a. Semigroup a => a -> a -> a <>Int -> Builder digits2 Int h Builder -> Builder -> Builder forall a. Semigroup a => a -> a -> a <>Char -> Builder char7 Char ':'Builder -> Builder -> Builder forall a. Semigroup a => a -> a -> a <>Int -> Builder digits2 Int m where!s :: Char s =ifInt off Int -> Int -> Bool forall a. Ord a => a -> a -> Bool <Int 0thenChar '-'elseChar '+'(Int h ,Int m )=Int -> Int forall a. Num a => a -> a absInt off Int -> Int -> (Int, Int) forall a. Integral a => a -> a -> (a, a) `quotRem`Int 60{-# INLINEbuildTimeZone #-}dayTime ::Day->TimeOfDay->BuilderdayTime :: Day -> TimeOfDay -> Builder dayTime Day d TimeOfDay t =Day -> Builder buildDay Day d Builder -> Builder -> Builder forall a. Semigroup a => a -> a -> a <>Char -> Builder char7 Char 'T'Builder -> Builder -> Builder forall a. Semigroup a => a -> a -> a <>TimeOfDay -> Builder buildTimeOfDay TimeOfDay t {-# INLINEdayTime #-}buildUTCTime ::UTCTime->B.BuilderbuildUTCTime :: UTCTime -> Builder buildUTCTime (UTCTimeDay d DiffTime s )=Day -> TimeOfDay -> Builder dayTime Day d (DiffTime -> TimeOfDay Local.timeToTimeOfDayDiffTime s )Builder -> Builder -> Builder forall a. Semigroup a => a -> a -> a <>Char -> Builder char7 Char 'Z'{-# INLINEbuildUTCTime #-}buildLocalTime ::Local.LocalTime->BuilderbuildLocalTime :: LocalTime -> Builder buildLocalTime (Local.LocalTimeDay d TimeOfDay t )=Day -> TimeOfDay -> Builder dayTime Day d TimeOfDay t {-# INLINEbuildLocalTime #-}buildZonedTime ::Local.ZonedTime->BuilderbuildZonedTime :: ZonedTime -> Builder buildZonedTime (Local.ZonedTimeLocalTime t TimeZone z )=LocalTime -> Builder buildLocalTime LocalTime t Builder -> Builder -> Builder forall a. Semigroup a => a -> a -> a <>TimeZone -> Builder buildTimeZone TimeZone z {-# INLINEbuildZonedTime #-}--------------------------------------------------------------------------------- Utilities-------------------------------------------------------------------------------digits2 ::Int->Builderdigits2 :: Int -> Builder digits2 Int a =Int -> Builder digit Int hi Builder -> Builder -> Builder forall a. Semigroup a => a -> a -> a <>Int -> Builder digit Int lo where(Int hi ,Int lo )=Int a Int -> Int -> (Int, Int) forall a. Integral a => a -> a -> (a, a) `quotRem`Int 10digit ::Int->Builderdigit :: Int -> Builder digit Int x =Char -> Builder char7 (Int -> Char chr(Int x Int -> Int -> Int forall a. Num a => a -> a -> a +Int 48))digit64 ::Int64->Builderdigit64 :: Int64 -> Builder digit64 =Int -> Builder digit (Int -> Builder) -> (Int64 -> Int) -> Int64 -> Builder forall b c a. (b -> c) -> (a -> b) -> a -> c .Int64 -> Int forall a b. (Integral a, Num b) => a -> b fromIntegralchar7 ::Char->Builderchar7 :: Char -> Builder char7 =Char -> Builder B.singleton