h*      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqr s tuvwxyz {|}~                                                                                                                                                                                      0.4.1 Safe-Inferred9 18844 Safe-Inferred( thyme(Case-insensitive UTF-8 ByteString parser&Matches one character at a time. Slow.thyme(Case-insensitive UTF-8 ByteString parserWe can't easily perform upper/lower case conversion on the input, so instead we accept either one of  toUpper c and  toLower c.thymeNumber may be prefixed with thymeFixed-length 0-padded decimalthyme!Fixed-length space-padded decimal Safe-Inferred%&(7<&:* thyme(Week-based calendar date with the first Monday' of the year as the first day of week 01. This corresponds to %W and %u of  http://www.gnu.org/software/libc/manual/html_node/Formatting-Calendar-Time.html#index-strftime strftime(3).(The final week of a given year and week 00* of the next both refer to the same week. thymeCoincides with that of 5.thymeWeeks numbered from 00 to 53, starting with the first Monday& of the year as the first day of week 01.thyme 7 = Sunday.thyme(Week-based calendar date with the first Sunday' of the year as the first day of week 01. This corresponds to %U and %w of  http://www.gnu.org/software/libc/manual/html_node/Formatting-Calendar-Time.html#index-strftime strftime(3).(The final week of a given year and week 00* of the next both refer to the same week.thymeCoincides with that of 5.thymeWeeks numbered from 00 to 53, starting with the first Sunday& of the year as the first day of week 01.thyme 0 = Sunday.thyme +https://en.wikipedia.org/wiki/ISO_week_dateISO 8601 Week Date.Note that week 017 is defined as the week with the first Thursday, thus , may differ from the Gregorian year between  December 29th and  January 3rd.thyme Numbered 01 to 53. Days before week 010 are considered to belong to the previous year.thyme 1 = Monday @  7 = Sunday.thymeDay of the week. 0Sunday for 1@6Monday@Saturday7Sunday for ,  , and thymeWeek of the year.*Meaning of values depends on context; see , , .thymeA strict pair of a + and a *. thymeAn  4https://en.wikipedia.org/wiki/ISO_8601#Ordinal_datesISO 8601 ordinal date.$thymeThe day of the year, with 1 = January 1st.%thymeA strict triple of a ,, a -, and a +.*thyme%Calendar day-of-month, starting from 1.+thymeCalendar month.  January = 1,thymeCalendar year.-thymeA calendar-agnostic day, internally represented as a count of days since  1858-11-17, the  1https://en.wikipedia.org/wiki/Julian_day#VariantsModified Julian Day (MJD) epoch. To convert a - to the corresponding % in the  0https://en.wikipedia.org/wiki/Gregorian_calendar Gregorian calendar, see 5. > 5  % 2016 3 1 2016-03-01 - is an instance of  where  - = 0, so arithmetic on - and 0 can be performed with the , , and  operators. > 5  % 2016 3 1  5  % 2016 2 1 29  > 5  % 2016 3 1  1 2016-02-29 Other ways of viewing a - include >, and G.0thymeA duration/count of days.1thymeA duration/count of months.2thymeA duration/count of years.3thymeConvert between a - and the corresponding count of days from 1858-11-17, the MJD epoch. 3 =  / . > 3  0 1858-11-17 > 5  % 2016 3 1  3   1 2016-02-29 4thymeConversion between a  0https://en.wikipedia.org/wiki/Gregorian_calendar Gregorian   and the corresponding %. >   2016 32  4 %, {ymdYear = 2016, ymdMonth = 2, ymdDay = 1} > 4  % 2016 2 1   {odYear = 2016, odDay = 32} 5thymeConversion between a - and its %. 5 = > . 4  > . 0  5 %. {ymdYear = 1858, ymdMonth = 11, ymdDay = 17} > 5  % 1858 11 17 1858-11-17 6thymeConversion between a % and the corresponding - . Returns  for invalid input. > 6 (% 2015 2 28)  2015-02-28 > 6 (% 2015 2 29)  7thymeShows a - in  5https://en.wikipedia.org/wiki/ISO_8601#Calendar_datesISO 8601  YYYY-MM-DD format.See Data.Thyme.Format for other possibilities.;thyme#Is it a leap year according to the  0https://en.wikipedia.org/wiki/Gregorian_calendar Gregorian calendar?>thymeConversion between the MJD - and  . > >    2016 32 2016-02-01  > / $ >    2016 32 57419 > . 57419  >   {odYear = 2016, odDay = 32} thymeNo good home for this within the current hierarchy. This will do.AthymePredicated on whether or not it's a leap year, convert between an ordinal $ and the corresponding + and *. > 60  A (; 2015)  { = 3,  = 1}  > 60  A (; 2016)  { = 2,  = 29}  > A (; 2016)   2 29 60  > A (; 2015)   2 28 59  Note that A is an improper , as the following example shows. To handle this case correctly, use B. > A (; 2015)   2 29 59 Bthyme9Predicated on whether or not it's a leap year, convert a  to an ordinal $. > B (; 2016) ( 2 29)  60 > B (; 2015) ( 2 29)  CthymePredicated on whether or not the year is a leap year, return the number of 0 in the given +. > monthLength (; 2015) 2 28 > monthLength (; 2016) 2 29 GthymeConvert between a - and an ISO 8601 . > % 2016 1 1   5  G  { = 2015,  = 53,  = 5} Hthyme Convert a  to a -, or  for invalid .IthymeShows a - using the  yyyy-Www-d ISO 8601 Week Date format. > I (5  % 2006 11 15) "2006-W46-3" MthymeConversion between - and . > % 2016 1 3   5  M  { = 2016,  = 1,  = 0} Nthyme Convert a  to a -, or  for invalid .RthymeConversion between - and  . > % 2016 1 3   5  R   {  = 2016,  = 0,  = 7} Sthyme Convert a   to a -, or  for invalid  .Athyme;?Bthyme;?Cthyme;?   #"!$%)('&*+,-/.0123456789:;<=>?@ABCDEFGHIJKLMNOPQRS Safe-Inferred%&()TthymePredicated on whether or not it is a leap year, convert an ordinal $ to its corresponding + and *. T leap ( (A leap) ->  m d) = (m, d) Uthyme:Predicated on whether or not it is a leap year, convert a + and * to its corresponding ordinal $. Does not validate the input. U leap m d = A leap   m d Vthyme:Predicated on whether or not it is a leap year, convert a + and * to its corresponding ordinal $ . Returns  for invalid input. V leap m d = B leap ( m d) Tthyme;?Uthyme;?Vthyme;?+*?@ABCUVT+*?@ABCUVT Safe-Inferred 67<)WXefWXef Safe-Inferred%&(67<@@othymeAn interval or duration of time, as would be measured by a stopwatch.o is an instance of  as well as , with  as its . We do not provide , ,  nor  instances here. See Data.Thyme.Docs#spaces for details. > w 100 :: o 100s > w 100  w 100  4 500s > w 100  w 100  4 75s pthyme"Time intervals, encompassing both o and x.NotesStill affected by  /http://hackage.haskell.org/trac/ghc/ticket/7611?qthymeConversion between p and  microseconds. > (w 3 :: o)  q 3000000 > q  4000000 :: o 4s rthymeMinute time-of-day.sthymeHour time-of-day.tthyme Convert a time interval to some  type.uthymeMake a time interval from some  type.Try to make sure n is one of , , ,  or , for which rewrite RULES have been provided.vthymeType-restricted t) to avoid constraint-defaulting warnings.wthymeType-restricted u) to avoid constraint-defaulting warnings.xthyme!The nominal interval between two {2s, which does not take leap seconds into account.$For example, the difference between 23:59:59 and 00:00:01. on the following day is always 2 seconds of x2, regardless of whether a leap-second took place.x is an instance of  as well as , with  as its . We do not provide , ,  nor  instances here. See Data.Thyme.Docs#spaces for details.  > let d = w 2 :: x > d 2s > d  3 0.666667s  See also: {.ythyme.The principal form of universal time, namely  4http://en.wikipedia.org/wiki/Universal_Time#VersionsUT1.UT1 is defined by the rotation of the Earth around its axis relative to the Sun. The length of each UT1 day varies and is never exactly 86400 SI seconds, unlike UTC or TAI.'The difference between UT1 and UTC is  !http://en.wikipedia.org/wiki/DUT1DUT1.zthyme#The nominal length of a POSIX day: 86400 SI seconds.{thyme 8https://en.wikipedia.org/wiki/Coordinated_Universal_TimeCordinated universal time ({) is the most commonly used standard for civil timekeeping. It is synchronised with  7https://en.wikipedia.org/wiki/International_Atomic_TimeTAI () and both tick in increments of SI seconds, but UTC includes occasional leap-seconds to keep it close to  5https://en.wikipedia.org/wiki/Universal_Time#VersionsUT1 (y). >   ~ (5  % 2016 1 15) (    , 12 34 56.78) 2016-01-15 12:34:56.78 UTC > { (5  % 2016 1 15) (    , 12 34 56.78) 2016-01-15 12:34:56.78 UTC > 3 2016 1 15 12 34 56.78 2016-01-15 12:34:56.78 UTC { is an  with x as its . See Data.Thyme.Docs#spaces for details.  > let t0 =  2016 1 15 23 59 0 > let t1 = " 2016 1 16 00 1 1 > let dt = t1  t0 > dt 121s :: x > t1 " dt 2016-01-16 00:03:02 UTC > t1  3  dt 2016-01-16 00:07:04 UTC To decompose a { into a separate - and time-of-day, use (. To convert to a local time zone, see   or  .Notes Internally { is just a 64-bit count of q* since the Modified Julian Day epoch, so (), () et cetera ought to be fast.{  (https://github.com/liyang/thyme/issues/3cannot represent leap seconds. If leap seconds matter, use   from Data.Thyme.Clock.TAI instead, along with   and ~ for presentation.}thymeConvert between y. and the fractional number of days since the  0http://en.wikipedia.org/wiki/Julian_day#VariantsModified Julian Date epoch.~thyme Unpacked { , partly for compatibility with time.%As of GHC 7.10, you can also use the { pattern synonym.thymeCalendar date.thymeTime elapsed since midnight; 0 D  < 86401s.thyme for the calendar - component of a ~.thyme for the time-of-day o component of a ~.thyme for the calendar - component of a {.thyme for the time-of-day o component of a {.thymeAccessor for the calendar - component of an {.  =   thymeAccessor for the time-of-day o component of an {.  =   thymeView { as an ~, comprising a - along with a o offset since midnight.This is an improper lens:  outside the range of [, z) will carry over into , with the expected behaviour. >     ~ { = 2016-01-15,  = 49322.287688s} >   ~ (5  % 2016 1 15) (    ) 12 34 56.78) 2016-01-15 12:34:56.78 UTC With {-# LANGUAGE ViewPatterns #-}, you can write: e.g. f :: { -> (-, o) f (  -> ~ day dt) = (day, dt) thyme Construct a { from a 5 date and time-of-day.  yy mm dd h m s D   ~ (5  % yy mm dd) (     h m (u s)) .opqrstuvwxyz{|}~  Safe-Inferred%&'(AthymeDisplay o or x in a human-readable form.thymeDisplay o or x in a human-readable form.thyme Display one {/ relative to another, in a human-readable form.thyme Display one {/ relative to another, in a human-readable form.  Safe-InferredEJthymeThe nominal (ignoring leap seconds) time difference since midnight 1970-01-01, the Unix epoch. Equvialent to a normalised  http://www.gnu.org/software/libc/manual/html_node/Elapsed-Time.htmlstruct timeval.thymeControl.Lens.Iso between { and . >  1459515013.527711s >     2016-01-01 12:50:45.588729 UTC thyme*Return the current system POSIX time via  http://www.gnu.org/software/libc/manual/html_node/High_002dResolution-Calendar.html gettimeofday, or getSystemTimeAsFileTime on Windows. See also ,  .thyme Construct a { from a .  =    t D   t thyme Convert a { to a .  =   zz Safe-InferredM thyme>Get the current UTC date and time from the local system clock. >  2016-01-15 13:42:02.287688 UTC  See also:  , .thymeConversion between p= and picoseconds. In the reverse direction, picoseconds are ed to the nearest microsecond.thyme Convert a y- to the fractional number of days since the  0http://en.wikipedia.org/wiki/Julian_day#VariantsModified Julian Date epoch.  =  } thyme Construct a y/ from the fractional number of days since the  0http://en.wikipedia.org/wiki/Julian_day#VariantsModified Julian Date epoch.  =  } thyme Construct a o from some number of seconds. This is just u with a more constrained type.  = u thyme Construct a o from some number of picoseconds. The input will be rounded to the nearest microsecond.  a = q   (a   a  500000) 1000000 thyme Decompose a { into a ~.  =   With {-# LANGUAGE ViewPatterns #-}, you can write: e.g. f :: { -> (Day, o) f ( -> ~ day dt) = (day, dt) 9For GHC 7.8 or later, there is also the pattern synonym  Data-Thyme-Clock.html#v:UTCTimeUTCTime.thyme"Add a duration to a point in time.  =  ()  d t D t  d  See also the  instance for {.thyme0The duration difference between two time points.  = ()  a b = a  b  See also the  instance for {.thyme The number of microseconds in a o or x.  :: o ->   :: x ->   =  q  d D d  q thyme Construct a o or x from a number of microseconds.  ::  -> o  ::  -> x  =  q  n D q  n ${~xopqtuvwy|}${~xopqtuvwy|} Safe-Inferred%&(XRthyme,The number of days in a given month in the  0https://en.wikipedia.org/wiki/Gregorian_calendar Gregorian calendar. >  2005 2 28 thymeAdd months, with days past the last day of the month clipped to the last day. See also . >  1  % 2005 1 30 % {' = 2005, ( = 2, ) = 28} thymeAdd months, with days past the last day of the month rolling over to the next month. See also . >  1 $ % 2005 1 30 % {' = 2005, ( = 3, ) = 2} thyme(Add years, matching month and day, with  February 29th clipped to the 28th if necessary. See also . >  2 $ % 2004 2 29 % {' = 2006, ( = 2, ) = 28} thyme(Add years, matching month and day, with  February 29th rolled over to  March 1st if necessary. See also . >  2 $ % 2004 2 29 % {' = 2006, ( = 3, ) = 1} thyme Add some 0 to a calendar - to get a new -.  =  ()  n d D d  n  See also the  instance for -.thymeSubtract two calendar -s for the difference in 0.  = ()  a b = a  b  See also the  instance for -.thyme Convert a - to its Gregorian ,, +, and *.  ( 5 -> % y m d) = (y, m, d) thyme Construct a -> from a Gregorian calendar date. Does not validate the input.  y m d = 5  % y m d thyme Construct a -* from a Gregorian calendar date. Returns  for invalid input.  y m d = 6 (% y m d) thymeAdd some number of 1 to the given -; if the original * exceeds that of the new +1, it will be clipped to the last day of the new +.  n = 5   n thymeAdd some number of 1 to the given -; if the original * exceeds that of the new +-, it will be rolled over into the following +.  n = 5   n thymeAdd some number of 2 to the given -, with  February 29th clipped to  February 28th if necessary.  n = 5   n thymeAdd some number of 2 to the given -, with  February 29th rolled over to  March 1st if necessary.  n = 5   n %-./3,+*%&'()89:210;4567%-./3,+*%&'()89:210;4567 Safe-Inferred%&(7<]0thyme=Calendar date with year, month-of-year, and n-th day-of-week.thymeCalendar year.thymeMonth of year.thymeN-th . Range 1@5; negative means the N -th last  of the month.thyme Day of week. 1 = Monday, 7 = Sunday, like ISO 8601 .thymeConversion between a - and and .This is a proper  if and only if all of the  fields are valid and positive.For example, the last Monday in  January 2016 is also the fourth Monday: >    2016 1 (-1) 1 2016-01-25 > % 2016 01 25   5    { = 2016,  = 1,  = 4,  = 1} thyme Convert a  to a - . Returns  for invalid input.For example, the third Sunday of  January 2016 is  2016-01-27, but there is no fifth Monday in  January 2016. >  ( 2016 1 3 7)  2016-01-17 >  ( 2016 1 5 1)  ,+,+ Safe-Inferred%&(fS thyme Convert an   to a -, or  for invalid input. >  (  2015 365)  2015-12-31 >  (  2015 366)  >  (  2016 366)  2016-12-31 thyme Convert a - to its Gregorian , and $.  ( > ->   y d) = (y, d) thymeConvert a Gregorian , and $ to a -. Does not validate the input.  y d = >    y d thymeConverts a Gregorian , and $ to a - . Returns  on invalid input.  y d =  (  y d) thyme Converts a - to its Sunday-starting week date. The first Sunday of the year belongs to 1 D *; earlier days in the same year are week 0. This corresponds to "%U" for  formatTime.Sunday is 0 D , Saturday is 6. This corresponds to "%w" for  formatTime.  ( M ->  y w d) = (y, w, d) thyme Converts a Sunday)-starting week date to the corresponding -; the inverse of . Does not validate the input.  y w d = M   y w d thyme Converts a Sunday)-starting week date to the corresponding -; the inverse of  . Returns  for invalid input.  y w d = N ( y w d) thyme Converts a - to its Monday-starting week date. The first Monday of the year belongs to 1 D *; earlier days in the same year are week 0. This corresponds to "%W" for  formatTime.Monday is 1 D , Sunday is 7. This corresponds to "%u" for  formatTime.  ( R ->   y w d) = (y, w, d) thyme Converts a Monday)-starting week date to the corresponding -; the inverse of . Does not validate the input.  y w d = R    y w d thyme Converts a Monday)-starting week date to the corresponding -; the inverse of  . Returns  for invalid input.  y w d = S (  y w d) ,;$ !"#<=>,;$ !"#<=> Safe-Inferred%&(hthyme Converts a - to an  +https://en.wikipedia.org/wiki/ISO_week_date ISO week date.  ( G ->  y w d) = (y, w, d) thyme Converts an  +https://en.wikipedia.org/wiki/ISO_week_date ISO week date to a -. Does not validate the input.  y w d = G   y w d thyme Converts an  +https://en.wikipedia.org/wiki/ISO_week_date ISO week date to a - . Returns  for invalid input.  y w d = H ( y w d) %,DEFGHIJKLMN OPQRS%,DEFGHIJKLMN OPQRS  Safe-Inferred%&(67<~+thyme$Time of day in hour, minute, second.thymeSecond.thymeDescription of one time zone.A  is a whole number of minutes offset from UTC, together with a name and a @summer time@ flag.thyme&The number of minutes offset from UTC.thyme8Is this a summer-only (i.e. daylight savings) time zone?thymeThe name of the zone, typically a three- or four-letter acronym.thymeMinutes duration.thymeHours duration.thymeText representing the offset of this timezone, e.g. "-0800" or "+0400" (like %z in )thymeText representing the offset of this timezone in ISO 8601 style, e.g. "-08:00" or "+04:00" (like %N in )thymeCreate a nameless non-summer timezone for this number of minutesthyme>Create a nameless non-summer timezone for this number of hoursthymeThe UTC (Zulu) time zone.  =  0  "UTC" thymeGet the local time zone at the given time, varying as per summer time adjustments.Performed by  https://www.gnu.org/software/libc/manual/html_node/Broken_002ddown-Time.html localtime_r or a similar call.thyme Get the current local time zone.  =  >>=  >  JST thyme$Local calendar date and time-of-day.This type is appropriate for inputting from and outputting to the outside world.To actually perform logic and arithmetic on local date-times, a ! should first be converted to a { by the  Iso. See also: .thymeLocal calendar date.thymeLocal time-of-day.thyme0The maximum possible length of a minute. Always 60s , except at 23:59 due to leap seconds.  23 59 = w 61  _ _ = w 60 thymeHour zero, midnight.  =  0 0  thymeHour twelve, noon.  =  12 0  thyme Construct a # from the hour, minute, and second.Returns ( if these constraints are not satisfied:0 D hour D 230 D minute D 590 D second <  hour minutethymeConversion between o and . > w 100   00:01:40 >    0 1 40 100s thymeAdd some minutes to a '; the result includes a day adjustment. >  10 ( 23 55 0) (1,00:05:00) thymeConversion between  and the fraction of a day. >  6 0 0   1 % 4 >  8 0 0   1 % 3 >   (1 / 4) 06:00:00 >   (1 / 3) 08:00:00 thymeA  and its .This type is appropriate for inputting from and outputting to the outside world.To actually perform logic and arithmetic on local date-times, a ! should first be converted to a { by the  Iso.thymeConversion between { and . > tz <-  >  tz "JST" >  tz "+0900" > now <- 9 > now 2016-04-23 02:00:00.000000 UTC > let local = now  * tz > local 2016-04-23 11:00:00.000000 >  tz & local 2016-04-23 02:00:00.000000 UTC  See also: .thymeConversion between y and .thymeConversion between (, {) and .  > now <- ) > now 2016-04-04 16:00:00.000000 JST >  . now (JST,2016-04-04 07:00:00.000000 UTC) > (  now)   2016-04-04 16:00:00.000000 JST  See also: .thyme0Get the current local date, time, and time zone. >  2016-04-23 11:57:22.516064 JST  See also: ,  .thyme Convert a { to a / according to the local time zone returned by . See also: .thymeConvert a UTC  to a 3 in some timezone, together with a day adjustment.  =    thyme Convert a  in some timezone to a UTC ", together with a day adjustment.  =      thyme Convert a o% of the duration since midnight to a . Durations exceeding 24 hours will be treated as leap-seconds.  =    d D d   thyme Convert a  to a o" of the duration since midnight. 7 greater than 24 hours will be treated as leap-seconds.  =    tod D   tod thyme0Convert a fraction of a day since midnight to a .  =   thyme Convert a ' to a fraction of a day since midnight.  =   thyme Convert a { to a  in the given .  =    thyme Convert a  in the given  to a {.  =    thyme Convert a y to a ( at the given medidian in degrees East.  =    thyme Convert a - at the given meridian in degrees East to a y.  =    thyme Convert a { and the given  into a .  z t =   (z, t) thyme Converts a  to a {.  =     srsr  Safe-Inferred"(7<Uthyme 7https://en.wikipedia.org/wiki/International_Atomic_TimeTemps Atomique International) (TAI). Note that for most applications {; is perfectly sufficient, and much more convenient to use./Internally this is the number of seconds since .. TAI days are exactly 86400 SI seconds long.thyme Each line of  *http://maia.usno.navy.mil/ser7/tai-utc.dat tai-utc.dat (see ) specifies the difference between TAI and UTC for a particular period. For example: 1968 FEB 1 =JD 2439887.5 TAI-UTC= 4.2131700 S + (MJD - 39126.) X 0.002592 S says that from 1968-02-01 00:00:00 (Julian Date 2439887.5; or Modified Julian Date 39887.0), the difference between TAI and UTC is  4.2131700s (the additive part) plus a scaled component that increases for each day beyond MJD 39126 (the base) by 0.002592s (the  coefficient<). In general, the latter half of each line is of the form:  TAI-UTC= additive S + (MJD - base) X  coefficient S  a b c0 is a normalised version of the above, with the base multiplied by 86400s, and the  coefficient divided by the same. This allows us to use the internal representation of {%@seconds since the MJD epoch@as the MJD term without further rescaling.Note that between 1961-01-01 and 1972-01-01, each UTC second was actually slightly longer than one TAI (or SI) second. For the first year this was at the rate of exactly 1.000000015 TAI (or SI) seconds per UTC second, but was subject to irregular updates. Since leap seconds came into effect on 1972-01-01, the additive? part has always been an intergral number of seconds, and the  coefficient has always been zero.;To convert between TAI and UTC, we refer to the definition: TAI - UTC = a + (MJD - b) * c Using UTC for MJD (with b and c scaled as described above): TAI = UTC + a + (UTC - b) * c TAI - a + b * c = UTC + UTC * c (TAI - a + b * c) / (1 + c) = UTC This is implemented by  and .Further reading: 8https://en.wikipedia.org/wiki/Coordinated_Universal_Time 7https://en.wikipedia.org/wiki/International_Atomic_TimethymeEach row comprises of an additive component, the base# of the scaled component, and the  coefficient of the scaled component.thyme A table of %s for converting between TAI and UTC.The two s are keyed on the corresponding instants in UTC and TAI from which the  becomes applicable. The { key of the first  is always at midnight.No table is provided here because leap seconds are unpredictable, and any program shipped with such a table could become out-of-date in as little as 6 months. See  for details.thymeThe  0http://en.wikipedia.org/wiki/Julian_day#VariantsModified Julian Day epoch, which is 1858-11-17 00:00:00 TAI.thymeConvert between { and  using a .Since { cannot represent a time-of-day of 86400s or more, any conversion from  that happens to be during a leap second will overflow into the next day.See  for how to obtain the tum ::  below.  > let jul1 =   ~ (5  % 2015 7 1)  > jul1   tum  ( u 1.1) 2015-06-30 23:59:59.9 UTC thymeConvert between ~ and TAI  using a .Unlike , ~ can represent a time-of-day greater than 86400s, and this gives the correct results during a leap second.See  for how to obtain the tum ::  below.  > let jul1 = ~ (5  % 2015 7 1)  > jul1   tum  ( u 0.1) ~ { = 2015-06-30,  = 86400.9s} However keep in mind that currently there is no standard way to get the TAI on most platforms. Simply converting the result of  (which calls gettimeofday(2)) to : during a leap second will still give non-monotonic times.thymeUsing a  , lookup the o length of the UTC -.See  for how to obtain the tum ::  below. >  tum     getCurrentTime 86400s >  tum  5  % 2015 6 30 86401s thyme attoparsec  for a single line of  *http://maia.usno.navy.mil/ser7/tai-utc.dat tai-utc.dat.Returns the starting { and the normalised .thymeBuild a  from the result of .thymeAdd a duration to an .  =  ()  d t D t  d  See also the  instance for .thyme$The duration difference between two s.  = ()  a b D a  b  See also the  instance for .thymeUsing a  , convert a { to .  =    thymeUsing a  , convert a  to {.  =     Safe-Inferred%&(6 thyme-All instances of this class may be parsed by , , and .thyme$Unconstituted date-time for parsing.thyme0All instances of this class may be formatted by .thyme Format a / instance value according to a template string.These formatting template codes are intended to be compatible with glibc  http://www.gnu.org/software/libc/manual/html_node/Formatting-Calendar-Time.html#index-strftime strftime() function, following Data.Time.Format, which follows  ! from the old-time# package. Codes which differ from  strftime() are marked as  EXTENSION.Show/Parse template string spec For all types %%literal "%"For  (and  and {): %z5RFC 822/ISO 8601:1988 style numeric time zone (e.g., "-0600" or "+0100") %N(ISO 8601 style numeric time zone (e.g., "-06:00" or "+01:00")  EXTENSION%Z timezone nameFor  (and  and { and y) %cThe preferred calendar time representation for the current locale. As  locale (e.g. %a %b %e %H:%M:%S %Z %Y)For  (and  and  and { and y) %Rsame as %H:%M %Tsame as %H:%M:%S%XThe preferred time of day representation for the current locale. As  locale (e.g. %H:%M:%S)%rThe complete calendar time using the AM/PM format of the current locale. As  locale (e.g.  %I:%M:%S %p)%Pday-half of day from ( locale), converted to lowercase, "am", "pm"%pday-half of day from ( locale), "AM", "PM"%H.hour of day (24-hour), 0-padded to two chars, "00"@"23"%k2hour of day (24-hour), space-padded to two chars, " 0"@"23"%I3hour of day-half (12-hour), 0-padded to two chars, "01"@"12"%l7hour of day-half (12-hour), space-padded to two chars, " 1"@"12"%M'minute of hour, 0-padded to two chars, "00"@"59"%Ssecond of minute (without decimal part), 0-padded to two chars, "00"@"60"%q0picosecond of second, 0-padded to twelve chars, "000000000000"@"999999999999".  EXTENSION%v.microsecond of second, 0-padded to six chars, "000000"@"999999".  EXTENSION%Qdecimal point and fraction of second, up to 6 second decimals, without trailing zeros. For a whole number of seconds, %Q produces the empty string.  EXTENSIONFor { %snumber of whole seconds since the Unix epoch. For times before the Unix epoch, this is a negative number. Note that in %s.%q and %s%Q the decimals are positive, not negative. For example, 0.9 seconds before the Unix epoch is formatted as "-1.1" with %s%Q.For - (and  and  and { and y) %Dsame as %m/%d/%y %Fsame as %Y-%m-%d%xas  locale (e.g. %m/%d/%y)%Yyear, no padding.%y(year of century, 0-padded to two chars, "00"@"99"%Ccentury, no padding.%Bmonth name, long form ( from  locale),  "January"@ "December"%b, %hmonth name, short form ( from  locale), "Jan"@"Dec"%m&month of year, 0-padded to two chars, "01"@"12"%d%day of month, 0-padded to two chars, "01"@"31"%e)day of month, space-padded to two chars, " 1"@"31"%j&day of year, 0-padded to three chars, "001"@"366"%G&year for Week Date format, no padding.%g=year of century for Week Date format, 0-padded to two chars, "00"@"99"%f*century for Week Date format, no padding.  EXTENSION%V:week of year for Week Date format, 0-padded to two chars, "01"@"53"%u"day of week for Week Date format, "1"@"7"%aday of week, short form ( from  locale), "Sun"@"Sat"%Aday of week, long form ( from  locale), "Sunday"@ "Saturday"%U-week of year where weeks start on Sunday (as sundayStartWeek), 0-padded to two chars, "00"@"53"%wday of week number, "0" (= Sunday) @ "6" (= Saturday)%W-week of year where weeks start on Monday (as "), 0-padded to two chars, "00"@"53"Examples &https://en.wikipedia.org/wiki/ISO_8601ISO 8601 >    "%Y-%m-%dT%H:%M:%S%N" $ 4 2015 1 15 12 34 56.78 "2015-01-15T12:34:56+00:00"  +http://tools.ietf.org/html/rfc822#section-5RFC822 >    "%a, %_d %b %Y %H:%M:%S %Z" $ 8 2015 1 15 12 34 56.78 "Thu, 15 Jan 2015 12:34:56 UTC" YYYY-MM-DD hh:mm:ss.000000 >    "%Y-%m-%d %H:%M:%S.%v" $ 5 2015 1 15 12 34 56.78 "2015-01-15 12:34:56.780000" thyme a year with a minimum of four digits (even in the first millennium), to comply with  ,https://en.wikipedia.org/wiki/ISO_8601#YearsISO 8601 Years.thyme Produce a  for UTF-8 encoded  ByteStrings.$This function is used internally by , , and 1; consider using one of those functions instead.Attoparsec easily beats any  parser out there, but we do have to be careful to convert the input to UTF-8  ByteStrings.thymeParse a string as a  instance value.Return  if parsing fails.Examples &https://en.wikipedia.org/wiki/ISO_8601ISO 8601 >   6 "%Y-%m-%dT%H:%M:%S%N" "2015-01-15T12:34:56+00:00" ::  {# Just 2015-01-15 12:34:56 UTC >   6 "%Y-%m-%dT%H:%M:%S%N" "2015-01-15T12:34:56-12:00" ::  { Just 2015-01-16 00:34:56 UTC YYYY-MM-DD hh:mm:ss.0 >   3 "%Y-%m-%d %H:%M:%S%Q" "2015-01-15 12:34:56.78" ::  {# Just 2015-01-15 12:34:56.78 UTC thymeParse a string as a  instance value.Call  if parsing fails.thyme Produce a  to parse a string as a  instance value.thymeLocale for formatting.thymeTemplate spec string.thyme instance value to be formatted.thymeLocale.thyme!Parser template spec string. See  for spec.thymeLocale.thyme!Parser template spec string. See  for spec.thymeString value to be parsed as a  instance value.thymeLocale.thyme!Parser template spec string. See  for spec.thymeString value to be parsed as a  instance value.thymeLocale.thyme!Parser template spec string. See  for spec.$ $ # Safe-Inferred<,-./*%&'()+210;7389:456{oxy~pq|tuvw}  sr  Safe-Inferred"7thymeA newtype wrapper for { that uses the same non-standard serialization format as Microsoft .NET, whose System.DateTime type is by default serialized to JSON as in the following example: /Date(1302547608878)/8The number represents milliseconds since the Unix epoch.$ Safe-Inferred$thyme Summons a  using template-haskell's  function.The first argument is a  matching the  we want: either its ?, or qualified with its module. The second argument gives the  to .1If no match is found or there is some ambiguity,  will fail with a list of "s found, along with the output of  for reference.Suppose we are given a module M that exports a function s, but not the type T, the constrcutor C, nor the field f: module M (s) where newtype T = C { f :: Int } s :: T -> T s = C . succ . f7In our own module we have no legitimate way of passing s an argument of type T1. We can get around this in a type-safe way with : {-# LANGUAGE TemplateHaskell #-} module Main where import Language.Haskell.TH.Syntax import Unsafe.TrueName import M type T = $(fmap ConT $ summon "T" 's) mkC :: Int -> T; unC :: T -> Int; f :: T -> Int mkC = $(fmap ConE $ summon "C" =<< summon "T" 's) unC $(fmap (`ConP` [VarP $ mkName "n"]) $ summon "C" =<< summon "T" 's) = n f = $(fmap VarE $ summon "f" =<< summon "T" 's) main :: IO () main = print (unC t, n) where t = s (mkC 42 :: T) n = f (s t) Note that  cannot obtain the ( for an unexported function, since GHC  http://hackage.haskell.org/package/template-haskell/docs/Language-Haskell-TH.html#v:VarI8does not currently return the RHS of function definitons9. The only workaround is to copypasta the definition. D:thymeA more convenient  interface to .2The first space-delimited token gives the initial  passed to : it must be @quoted@ with a ' or '' prefix to indicate whether it should be interpreted in an expression or a type context, as per  https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/template-haskell.html#th-syntaxthe usual TH syntax'. Subsequent tokens correspond to the  argument of , and are iterated over. Thus [truename| ''A B C D |]is roughly equivalent to: ,summon "D" =<< summon "C" =<< summon "B" ''Abut with the resulting  wrapped up in , , , or ), depending on the context. (There is no .)$Variable bindings are given after a | token in a  context: 2[truename| ''Chan Chan | chanR chanW |] <- newChanThese may be prefixed with ! or ~( to give the usual semantics. A single .. token invokes RecordWildCards in + contexts, and for record construction in = contexts. Nested or more exotic patterns are not supported.With this, the example from  may be more succinctly written: {-# LANGUAGE QuasiQuotes #-} module Main where import Unsafe.TrueName import M type T = [truename| 's T |] mkC :: Int -> T; unC :: T -> Int; f :: T -> Int mkC = [truename| 's T C |] unC [truename| 's T C | n |] = n f = [truename| 's T f |] main :: IO () main = print (unC t, n) where t = s (mkC 42 :: T) n = f (s t) Safe-Inferred%&(9thyme!Typeclass for converting between  Data.Time and  Data.Thyme types.thymeConvert between  Data.Time and  Data.Thyme types. > :set -t > import qualified  Data.Time >   (w 10 :: o ) 10s it :: %& > %' 10   :: o 10s it :: o thyme Convert a  Data.Time type to a  Data.Thyme$ type, if you would rather not use  Control.Lens directly.  =    t D t   thyme Convert a  Data.Thyme type to a  Data.Time$ type, if you would rather not use  Control.Lens directly.  =    t D   t { ,-./*%&'()+oxy210~pqsr| ;7389:456tuvw} Safe-Inferred6á{ ,-./*%&'()+oxy210~pqsr| ;7389:456tuvw}( Safe-Inferred)*+)*+)*,)*-)*.)*/)*0)*1)*2)*3)*45567899:;<==>?@ABCCDEFFGHIJJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{{|}~&         '"                                                                                                                                                                             &$$"thyme-0.4.1-JF452LdbqmqKJs722uy8nNData.Thyme.FormatData.Thyme.Calendar.WeekDate"Data.Thyme.Calendar.WeekdayOfMonthData.Thyme.Calendar.MonthDayData.Thyme.Calendar.OrdinalDateData.Thyme.CalendarData.Thyme.Internal.MicroData.Thyme.ClockData.Thyme.LocalTimeData.Thyme.Clock.POSIXData.Thyme.Format.HumanData.Thyme.Clock.TAIData.Thyme.Format.AesonData.Thyme.Time.CoreData.Thyme.Timethyme Control.LensData.Thyme.Format.InternalData.Thyme.Calendar.InternalWeekdayOfMonthData.Thyme.Clock.Internal AbsoluteTime timeOfDay TimeOfDay zonedTime utcLocalTime absoluteTime'getCurrentTime getZonedTime formatTime getPOSIXTime System.TimeformatCalendarTimemondayStartWeek Data.ThymeData.Thyme.TrueName Data.TimeDiffTimesecondsToDiffTimeData.Thyme.Docs time-1.12.2Data.Time.Format.Locale TimeLocalewDaysmonthsamPm dateTimeFmtdateFmttimeFmt time12FmtknownTimeZonesdefaultTimeLocale MondayWeekmwYearmwWeekmwDay SundayWeekswYearswWeekswDayWeekDatewdYearwdWeekwdDay DayOfWeek WeekOfYearMonthDaymdMonthmdDay OrdinalDateodYearodDay DayOfYear YearMonthDayymdYearymdMonthymdDay DayOfMonthMonthYearDayModifiedJulianDaytoModifiedJulianDayDaysMonthsYearsmodifiedJulianDay yearMonthDay gregoriangregorianValid showGregorian_ymdYear _ymdMonth_ymdDay isLeapYear_odYear_odDay ordinalDate_mdMonth_mdDaymonthDay monthDayValid monthLength_wdYear_wdWeek_wdDayweekDate weekDateValid showWeekDate_swYear_swWeek_swDay sundayWeeksundayWeekValid_mwYear_mwWeek_mwDay mondayWeekmondayWeekValiddayOfYearToMonthAndDaymonthAndDayToDayOfYearmonthAndDayToDayOfYearValidMicro $fEqMicro $fOrdMicro $fDataMicro$fGenericMicro $fEnumMicro $fIxMicro$fHashableMicro $fNFDataMicro$fBoundedMicro $fRandomMicro$fArbitraryMicro$fCoArbitraryMicro microQuotRem microDivMod$fHasBasisMicro$fVectorSpaceMicro$fAdditiveGroupMicro $fReadMicro $fShowMicro$fVectorVectorMicro$fMVectorMVectorMicro $fUnboxMicroTimeDiff microsecondsMinuteHour toSeconds fromSeconds toSeconds' fromSeconds'NominalDiffTime UniversalTimeposixDayLengthUTCTime modJulianDateUTCViewutcvDay utcvDayTime_utcvDay _utcvDayTime_utctDay _utctDayTimeutctDay utctDayTimeutcTime mkUTCTime humanTimeDiffhumanTimeDiffs humanRelTime humanRelTimes POSIXTime posixTimeposixSecondsToUTCTimeutcTimeToPOSIXSeconds picosecondsgetModJulianDatemkModJulianDatepicosecondsToDiffTime unUTCTime addUTCTime diffUTCTimetoMicrosecondsfromMicrosecondsgregorianMonthLengthgregorianMonthsClipgregorianMonthsRollovergregorianYearsClipgregorianYearsRolloveraddDaysdiffDays toGregorian fromGregorianfromGregorianValidaddGregorianMonthsClipaddGregorianMonthsRolloveraddGregorianYearsClipaddGregorianYearsRollover$fCoArbitraryYearMonthDay$fArbitraryYearMonthDay$fArbitraryDay$fRandomYearMonthDay $fRandomDay$fBoundedYearMonthDay $fBoundedDaywomYearwomMonthwomNth womDayOfWeek_womYear _womMonth_womNth _womDayOfWeek$fEqWeekdayOfMonth$fOrdWeekdayOfMonth$fDataWeekdayOfMonth$fGenericWeekdayOfMonth$fShowWeekdayOfMonthV_WeekdayOfMonthMV_WeekdayOfMonthweekdayOfMonthweekdayOfMonthValid$fCoArbitraryWeekdayOfMonth$fArbitraryWeekdayOfMonth$fRandomWeekdayOfMonth$fBoundedWeekdayOfMonth$fNFDataWeekdayOfMonth$fHashableWeekdayOfMonth$fVectorVectorWeekdayOfMonth$fMVectorMVectorWeekdayOfMonth$fUnboxWeekdayOfMonthordinalDateValid toOrdinalDatefromOrdinalDatefromOrdinalDateValidsundayStartWeekfromSundayStartWeekfromSundayStartWeekValidfromMondayStartWeekfromMondayStartWeekValid$fCoArbitraryOrdinalDate$fArbitraryOrdinalDate$fRandomOrdinalDate$fBoundedOrdinalDate toWeekDate fromWeekDatefromWeekDateValid$fCoArbitraryMondayWeek$fCoArbitrarySundayWeek$fCoArbitraryWeekDate$fArbitraryMondayWeek$fArbitrarySundayWeek$fArbitraryWeekDate$fRandomMondayWeek$fRandomSundayWeek$fRandomWeekDate$fBoundedMondayWeek$fBoundedSundayWeek$fBoundedWeekDatetodHourtodMintodSecTimeZonetimeZoneMinutestimeZoneSummerOnly timeZoneNameMinutesHours_timeZoneMinutes_timeZoneSummerOnly _timeZoneNametimeZoneOffsetStringtimeZoneOffsetStringColonminutesToTimeZonehoursToTimeZoneutc getTimeZonegetCurrentTimeZone_todHour_todMin_todSec$fCoArbitraryTimeZone$fArbitraryTimeZone$fRandomTimeZone$fBoundedTimeZone$fShowTimeZone$fNFDataTimeZone$fHashableTimeZone $fEqTimeOfDay$fOrdTimeOfDay$fDataTimeOfDay$fGenericTimeOfDay $fEqTimeZone $fOrdTimeZone$fDataTimeZone$fGenericTimeZone LocalTimelocalDaylocalTimeOfDay V_TimeOfDay MV_TimeOfDay minuteLengthmidnightmiddaymakeTimeOfDayValid addMinutes dayFraction _localDay_localTimeOfDay$fCoArbitraryTimeOfDay$fArbitraryTimeOfDay$fRandomTimeOfDay$fBoundedTimeOfDay$fShowTimeOfDay$fNFDataTimeOfDay$fHashableTimeOfDay$fVectorVectorTimeOfDay$fMVectorMVectorTimeOfDay$fUnboxTimeOfDay $fEqLocalTime$fOrdLocalTime$fDataLocalTime$fGenericLocalTime ZonedTimezonedTimeToLocalTime zonedTimeZone V_LocalTime MV_LocalTime ut1LocalTime_zonedTimeToLocalTime_zonedTimeZoneutcToLocalZonedTimeutcToLocalTimeOfDaylocalToUTCTimeOfDaytimeToTimeOfDaytimeOfDayToTimedayFractionToTimeOfDaytimeOfDayToDayFractionutcToLocalTimelocalTimeToUTCut1ToLocalTimelocalTimeToUT1utcToZonedTimezonedTimeToUTC $fShowUTCTime$fCoArbitraryLocalTime$fArbitraryLocalTime$fRandomLocalTime$fBoundedLocalTime$fShowLocalTime$fNFDataLocalTime$fHashableLocalTime$fVectorVectorLocalTime$fMVectorMVectorLocalTime$fUnboxLocalTime$fShowZonedTime$fCoArbitraryZonedTime$fArbitraryZonedTime$fRandomZonedTime$fBoundedZonedTime$fNFDataZonedTime$fHashableZonedTime $fEqZonedTime$fOrdZonedTime$fDataZonedTime$fGenericZonedTime$fEqAbsoluteTime$fOrdAbsoluteTime$fDataAbsoluteTime$fGenericAbsoluteTime$fEnumAbsoluteTime$fIxAbsoluteTime$fHashableAbsoluteTime$fNFDataAbsoluteTime$fBoundedAbsoluteTime$fRandomAbsoluteTime$fArbitraryAbsoluteTime$fCoArbitraryAbsoluteTime TAIUTCRow TAIUTCMaptaiEpoch absoluteTime utcDayLengthparseTAIUTCRow makeTAIUTCMapparseTAIUTCDATaddAbsoluteTimediffAbsoluteTime utcToTAITime taiToUTCTime$fAffineSpaceAbsoluteTime$fVectorVectorAbsoluteTime$fMVectorMVectorAbsoluteTime$fUnboxAbsoluteTime$fShowAbsoluteTime $fEqTAIUTCMap$fOrdTAIUTCMap$fDataTAIUTCMap$fGenericTAIUTCMap$fShowTAIUTCMap $fEqTAIUTCRow$fOrdTAIUTCRow$fDataTAIUTCRow$fGenericTAIUTCRow$fShowTAIUTCRow ParseTime buildTime TimeParse tpCentury tpCenturyYeartpMonth tpWeekOfYear tpDayOfMonth tpDayOfYear tpDayOfWeektpFlagstpHourtpMinutetpSecond tpSecFrac tpPOSIXTime tpTimeZone FormatTime showsTime timeParser parseTimereadTime readsTime $fReadUTCTime$fReadZonedTime$fReadLocalTime$fReadTimeOfDay $fReadDay$fFormatTimeAbsoluteTime$fFormatTimeUniversalTime$fFormatTimeUTCTime$fFormatTimeZonedTime$fFormatTimeTimeZone$fFormatTimeDay$fFormatTimeLocalTime$fFormatTimeMondayWeek$fFormatTimeSundayWeek$fFormatTimeWeekDate$fFormatTimeOrdinalDate$fFormatTimeMonthDay$fFormatTimeYearMonthDay$fFormatTimeTimeOfDay$fParseTimeAbsoluteTime$fParseTimeUniversalTime$fParseTimeUTCTime$fParseTimeZonedTime$fParseTimeTimeZone$fParseTimeDay$fParseTimeLocalTime$fParseTimeMondayWeek$fParseTimeSundayWeek$fParseTimeWeekDate$fParseTimeOrdinalDate$fParseTimeMonthDay$fParseTimeYearMonthDay$fParseTimeTimeOfDay$fShowTimeParse$fEnumTimeFlag$fShowTimeFlag $fReadUTCView DotNetTimefromDotNetTime$fFromJSONUTCTime$fToJSONUTCTime$fFromJSONZonedTime$fToJSONZonedTime$fFromJSONDotNetTime$fToJSONDotNetTime$fEqDotNetTime$fOrdDotNetTime$fReadDotNetTime$fShowDotNetTime$fFormatTimeDotNetTimeThymetoThyme fromThyme$fThymeZonedTimeZonedTime$fThymeLocalTimeLocalTime$fThymeTimeOfDayTimeOfDay$fThymeTimeZoneTimeZone$fThymeAbsoluteTimeAbsoluteTime$fThymeUTCTimeUTCTime$fThymeUTCTimeUTCView%$fThymeNominalDiffTimeNominalDiffTime$fThymeDiffTimeDiffTime!$fThymeUniversalTimeUniversalTime $fThymeDayDay$fRealFracMicro$fFractionalMicro $fRealMicro $fNumMicro$fRealFracNominalDiffTime$fFractionalNominalDiffTime$fRealNominalDiffTime$fNumNominalDiffTime$fRealFracDiffTime$fFractionalDiffTime$fRealDiffTime $fNumDiffTime&IsoIso'isofromreview#LensLens'lensview^.setover%~assign.=stringCIcharCInegativebaseGHC.Num-dec0dec_utf8Char utf8Stringshows02shows_2shows03 showsYearfills06drops0 parserToReadSindexOf indexOfCIcharU8(vector-space-0.19-9A7jhKTlCVjLn8RtyrDybEData.AffineSpace AffineSpaceDiff.-..+^.-^subtract GHC.MaybeNothingJust randomIsoRGHC.Base.&vector-0.13.2.0-3Q4dFubLMGI6ysVlbEg8ifData.Vector.Unboxed.BaseMVectorMV_Day MV_MondayWeek MV_SundayWeek MV_WeekDate MV_MonthDayMV_OrdinalDateMV_YearMonthDayVectorV_Day V_MondayWeek V_SundayWeek V_WeekDate V_MonthDay V_OrdinalDateV_YearMonthDay monthLengthsmonthLengthsLeap monthDays monthDaysLeap toWeekOrdinallastWeekOfYear fromWeekLasttoSundayOrdinaltoMondayOrdinalMV_MicroV_MicroData.AdditiveGroup AdditiveGroupData.VectorSpace VectorSpaceGHC.RealRationalScalarNumReal FractionalRealFrac^+^^*^-^^/GHC.IntInt64ghc-prim GHC.TypesFloatDoubleInt ghc-bignumGHC.Num.IntegerInteger*^zeroV Data.Functor<$> MV_DiffTime MV_UTCView MV_UTCTimeMV_UniversalTimeMV_NominalDiffTime V_DiffTime V_UTCView V_UTCTimeV_UniversalTimeV_NominalDiffTimefromSecondsRealFracfromSecondsIntegral UniversalRepUTCReproundquot+signum*flip$FalseControl.Categorynegate Data.Tuplesndcontainers-0.6.7Data.Map.InternalMap(attoparsec-0.14.4-9S40HjQ6YGO2AfXUiJZIGV#Data.Attoparsec.ByteString.InternalParserfstshowsYGHC.ShowShowSStringMaybeGHC.ErrerrorText.ParserCombinators.ReadPReadSsummontemplate-haskellLanguage.Haskell.TH.SyntaxNamereifynameBasetruenameLanguage.Haskell.TH.Quote QuasiQuoterConEVarEConPConTquoteDecPatExp