rfc-0.0.0.1: src/RFC/Data/IdAnd.hs
module RFC.Data.IdAnd
( idAndsToMap
, IdAnd(..)
, valuesToIdAnd
, idAndToTuple
, tupleToIdAnd
, idAndToPair
) where
import RFC.Prelude
import RFC.JSON
import Data.Aeson as JSON
import Data.Map as Map
import Data.List as List hiding ((++))
import Database.PostgreSQL.Simple.ToRow
import Database.PostgreSQL.Simple.FromRow
import Database.PostgreSQL.Simple.ToField
import Database.PostgreSQL.Simple.FromField()
-- |Represents something which has an ID.
newtype IdAnd a = IdAnd (UUID, a)
deriving (Eq, Ord, Show, Generic, Typeable)
tupleToIdAnd :: (UUID, a) -> IdAnd a
tupleToIdAnd = IdAnd
valuesToIdAnd :: UUID -> a -> IdAnd a
valuesToIdAnd id a = IdAnd(id,a)
idAndToTuple :: IdAnd a -> (UUID, a)
idAndToTuple (IdAnd it) = it
idAndToPair :: IdAnd a -> (UUID, IdAnd a)
idAndToPair idAnd@(IdAnd (id,_)) = (id, idAnd)
idAndsToMap :: [IdAnd a] -> Map UUID a
idAndsToMap list = Map.fromList $ List.map idAndToTuple list
instance (FromJSON a) => FromJSON (IdAnd a) where
parseJSON = JSON.withObject "IdAnd" $ \o -> do
id <- o .: "id"
value <- o .: "value"
return $ IdAnd(id, value)
instance (ToJSON a) => ToJSON (IdAnd a) where
toJSON (IdAnd (id,value)) = object [ "id".=id, "value".=value ]
instance (FromRow a) => FromRow (IdAnd a) where
fromRow = valuesToIdAnd <$> field <*> fromRow
instance (ToRow a) => ToRow (IdAnd a) where
toRow (IdAnd (id,a)) = toField id : toRow a