git.iko.soy/typeable/flat-instances
on master help sign in
instances for Data.Time
commit60855e35ce96fd1fb7173584a6b487c1eb89c5d2 authorDmitry Olshansky <olshanskydr@gmail.com> dateThu 15 Dec 2022, 01:08 (4 years ago) parentd559f59
4 files changed+115
flat-instances.cabal+30 src/Flat/Instances.hs+69 stack.yaml+4 stack.yaml.lock+12
flat-instances.cabalnew file+30
@@ -0,0 +1,30 @@
1+cabal-version: 2.4
2+
3+name: flat-instances
4+version: 0.1.0.0
5+license-file: LICENSE
6+
7+library
8+ exposed-modules:
9+ Flat.Instances
10+ build-depends:
11+ base,
12+ flat,
13+ time,
14+ hs-source-dirs:
15+ src
16+ default-language:
17+ Haskell2010
18+ -- default-extensions:
19+ -- DerivingVia
20+ -- StandaloneDeriving
21+ -- AllowAmbiguousTypes
22+ -- DeriveGeneric
23+ -- DerivingStrategies
24+ -- GeneralizedNewtypeDeriving
25+ -- PolyKinds
26+ -- RankNTypes
27+ -- RoleAnnotations
28+ -- ScopedTypeVariables
29+ -- TypeApplications
30+ -- TypeFamilies
src/Flat/Instances.hsnew file+69
@@ -0,0 +1,69 @@
1+{-# LANGUAGE DerivingVia #-}
2+{-# LANGUAGE NamedFieldPuns #-}
3+{-# LANGUAGE RecordWildCards #-}
4+{-# LANGUAGE StandaloneDeriving #-}
5+{-# LANGUAGE ViewPatterns #-}
6+{-# OPTIONS_GHC -fno-warn-orphans #-}
7+
8+
9+module Flat.Instances where
10+
11+import Data.Fixed
12+import Data.Time
13+import Flat as F
14+
15+
16+deriving via Integer instance Flat Day
17+
18+instance Flat DiffTime where
19+ encode = F.encode . diffTimeToPicoseconds
20+ decode = picosecondsToDiffTime <$> F.decode
21+ size = F.size . diffTimeToPicoseconds
22+
23+utcTimeToTuple :: UTCTime -> (Day, DiffTime)
24+utcTimeToTuple = ((,) <$> utctDay <*> utctDayTime)
25+
26+instance Flat UTCTime where
27+ encode = F.encode . utcTimeToTuple
28+ decode = uncurry UTCTime <$> F.decode
29+ size = F.size . utcTimeToTuple
30+
31+timeOfDayToTuple :: TimeOfDay -> (Int, Int, Pico)
32+timeOfDayToTuple TimeOfDay{..} = (todHour, todMin, todSec)
33+
34+tupleToTimeOfDay :: (Int, Int, Pico) -> TimeOfDay
35+tupleToTimeOfDay (todHour, todMin, todSec) = TimeOfDay{..}
36+
37+instance Flat TimeOfDay where
38+ encode = F.encode . timeOfDayToTuple
39+ decode = tupleToTimeOfDay <$> F.decode
40+ size = F.size . timeOfDayToTuple
41+
42+localTimeToTuple :: LocalTime -> (Day, TimeOfDay)
43+localTimeToTuple LocalTime{..} = (localDay, localTimeOfDay)
44+
45+instance Flat LocalTime where
46+ size = F.size . localTimeToTuple
47+ encode = F.encode . localTimeToTuple
48+ decode = uncurry LocalTime <$> F.decode
49+
50+timeZoneToTuple :: TimeZone -> (Int, Bool, String)
51+timeZoneToTuple TimeZone{..} =
52+ (timeZoneMinutes, timeZoneSummerOnly, timeZoneName)
53+
54+tupleToTimeZone :: (Int, Bool, String) -> TimeZone
55+tupleToTimeZone (timeZoneMinutes, timeZoneSummerOnly, timeZoneName) =
56+ TimeZone{..}
57+
58+instance Flat TimeZone where
59+ size = F.size . timeZoneToTuple
60+ encode = F.encode . timeZoneToTuple
61+ decode = tupleToTimeZone <$> F.decode
62+
63+zonedTimeToTuple :: ZonedTime -> (LocalTime, TimeZone)
64+zonedTimeToTuple ZonedTime{..} = (zonedTimeToLocalTime, zonedTimeZone)
65+
66+instance Flat ZonedTime where
67+ size = F.size . zonedTimeToTuple
68+ encode = F.encode . zonedTimeToTuple
69+ decode = uncurry ZonedTime <$> F.decode
stack.yamlnew file+4
@@ -0,0 +1,4 @@
1+resolver: lts-19.6
2+
3+packages:
4+- .
stack.yaml.locknew file+12
@@ -0,0 +1,12 @@
1+# This file was autogenerated by Stack.
2+# You should not edit this file by hand.
3+# For more information, please see the documentation at:
4+# https://docs.haskellstack.org/en/stable/lock_files
5+
6+packages: []
7+snapshots:
8+- completed:
9+ sha256: fb634b19f31da06684bb07ce02a20c75a3162138f279b388905b03ebd57bb50f
10+ size: 618876
11+ url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/19/6.yaml
12+ original: lts-19.6