module Database.Groundhog.Converters ( makeConverter
, flipConverter
, composeConverter
, fmapConverter
, bicomposeConverter
, firstConverter
, secondConverter
, jsonConverter
, integerConverter
, mapConverter
, bimapConverter
, intMapConverter
, Converter
) where
import Control.Arrow (first, second, (***))
import Data.Aeson (ToJSON,FromJSON,encode,eitherDecode)
import Data.Int (Int64)
import Data.Map.Strict (Map)
import Data.IntMap (IntMap)
import qualified Data.IntMap as IntMap
import qualified Data.Map.Strict as Map
import qualified Data.ByteString.Lazy as BL
import Data.Bimap (Bimap)
import qualified Data.Bimap as Bimap
type Converter a b = (a -> b, b -> a)
makeConverter :: (a -> b)
-> (b -> a)
-> Converter a b
makeConverter ab ba = (ab, ba)
flipConverter :: Converter a b -> Converter b a
flipConverter (ba, ab) = (ab, ba)
composeConverter :: Converter a b -> Converter b c -> Converter a c
composeConverter (ab, ba) (bc, cb) = (bc . ab, ba . cb)
fmapConverter :: Functor f => Converter a b -> Converter (f a) (f b)
fmapConverter (ba, ab) = (fmap ba, fmap ab)
bicomposeConverter :: Converter a b -> Converter c d -> Converter (a,c) (b,d)
bicomposeConverter (ba,ab) (dc,cd) = (ba *** dc, ab *** cd)
firstConverter :: Converter a b -> Converter (a, c) (b, c)
firstConverter (ba, ab) = (first ba, first ab)
secondConverter :: Converter a b -> Converter (c, a) (c, b)
secondConverter (ba, ab) = (second ba, second ab)
jsonConverter :: (ToJSON a, FromJSON a) => Converter a BL.ByteString
jsonConverter = makeConverter encode (either error id . eitherDecode)
integerConverter :: Converter Integer Int64
integerConverter = makeConverter fromInteger fromIntegral
mapConverter :: (Ord k) => Converter (Map k v) [(k, v)]
mapConverter = makeConverter Map.toList Map.fromList
bimapConverter :: (Ord a, Ord b) => Converter (Bimap a b) [(a, b)]
bimapConverter = makeConverter Bimap.toList Bimap.fromList
intMapConverter :: Converter (IntMap a) [(Int, a)]
intMapConverter = makeConverter IntMap.toList IntMap.fromList