# herf-time [![Circle CI](https://circleci.com/gh/smurphy8/herf-time.svg?style=svg)](https://circleci.com/gh/smurphy8/herf-time) Haskell's time library is nice but I wanted to be able to do some of the operations in the [Kerf](https://github.com/kevinlawler/kerf) programming language. By creating a set of type classes: **HerfedTime** , **ToUTCHerfTime**, **FromUTCHerfTime** I think there is a nice mechanism to do just that. any instance of these 3 classes should satisfy the law: * **Path Independant** on all addtion * ``` addX a X == unherf (addX (herf a) X )``` * where: ``` addX := {addYear , addMonth, addWeek ...}``` # Tutorial [Herf Tutorial](http://blog.plowtech.net/posts/herf-time.html) ## Usage ### Add Intervals ``` haskell >>> date 2016 01 01 `add` hour 3 `add` week 16 `add` month 3 :: UTCTime UTCHerfTime 2016-07-22 03:00:00 UTC ``` ### Subtract Intervals ``` haskell >>> date 2016 01 01 `add` hour (-3) `add` week (-16) `add` month (-3) :: UTCTime UTCHerfTime 2015-06-10 21:00:00 UTC ``` ### Represent Time in Multiple Ways ``` haskell >>> dateTime 2016 01 01 01 23 01 `add` hour 3 `add` week 16 `add` month 3 :: UTCTime UTCHerfTime 2016-07-22 04:23:01 UTC >>> dateTimePico 2016 01 01 01 23 01 01 `add` hour 3 `add` week 16 `add` month 3 :: UTCTime UTCHerfTime 2016-07-22 04:23:01.000000000001 UTC ``` ### Get Times in any HerfedTime format (UTC for example) ``` haskell >>> date 2016 01 01 `add` hour 3 `add` week 16 `add` month 3 :: UTCTime 2016-07-22 03:00:00 UTC ``` ### Use HerfTime.ZonedTime to convert easily between times (reherf $ ( dateTime 2016 01 01 01 01 01 :: HerfZonedTime "CST")) :: HerfZonedTime "PST" 2015-12-31T23:01:01:PST ### Some fancier examples (Using HerfTime.ZonedTime) ``` haskell λ> zt <- getZonedTime λ> herfShow zt "2016-01-21T11:29:05:CST" λ> reherfz zt :: HerfZonedTime "PST" 2016-01-21T09:29:05:PST λ> reherfz zt :: HerfZonedTime "+0600" 2016-01-21T23:29:05:+0600 λ> reherfz zt :: HerfZonedTime "CST" 2016-01-21T11:29:05:CST λ> (reherfz zt) `add` month 2 :: HerfZonedTime "CST" 2016-03-21T11:29:05:CST -- What time will it be exactly 3 months from now in California? λ> (reherfz zt) `add` month 2 :: HerfZonedTime "PST" 2016-03-21T09:29:05:PST ``` ``` cabal configure --enable-tests && cabal build && cabal test ```