data-object 0.0.0 → 0.0.1
raw patch · 2 files changed
+60/−19 lines, 2 filesdep +timePVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependencies added: time
API changes (from Hackage documentation)
- Data.Object: instance [overlap ok] (StrictByteString bs, FromObject o) => FromObject [(bs, o)]
- Data.Object: instance [overlap ok] (StrictByteString bs, ToObject o) => ToObject [(bs, o)]
+ Data.Object: class (FromObject a) => FromScalar a
+ Data.Object: class (ToObject a) => ToScalar a
+ Data.Object: fromScalar :: (FromScalar a, Monad m) => ByteString -> m a
+ Data.Object: instance [overlap ok] (FromScalar bs, FromObject o) => FromObject [(bs, o)]
+ Data.Object: instance [overlap ok] (ToScalar bs, ToObject o) => ToObject [(bs, o)]
+ Data.Object: instance [overlap ok] FromObject Day
+ Data.Object: instance [overlap ok] FromScalar ByteString
+ Data.Object: instance [overlap ok] FromScalar Day
+ Data.Object: instance [overlap ok] FromScalar String
+ Data.Object: instance [overlap ok] ToObject Day
+ Data.Object: instance [overlap ok] ToScalar ByteString
+ Data.Object: instance [overlap ok] ToScalar Day
+ Data.Object: instance [overlap ok] ToScalar String
+ Data.Object: toScalar :: (ToScalar a) => a -> ByteString
Files
- Data/Object.hs +57/−17
- data-object.cabal +3/−2
Data/Object.hs view
@@ -3,7 +3,7 @@ {-# LANGUAGE OverlappingInstances #-} --------------------------------------------------------- ----- Module : Web.ClientSession+-- Module : Data.Object -- Copyright : Michael Snoyman -- License : BSD3 --@@ -21,12 +21,15 @@ ( Object (..) , FromObject (..) , ToObject (..)+ , FromScalar (..)+ , ToScalar (..) , oLookup ) where import qualified Data.ByteString as B import Data.ByteString.Class import Control.Arrow+import Data.Time.Calendar data Object = Mapping [(B.ByteString, Object)]@@ -36,26 +39,36 @@ class ToObject a where toObject :: a -> Object- class FromObject a where fromObject :: Monad m => Object -> m a -bsFromObject :: (Monad m, StrictByteString bs) => Object -> m bs-bsFromObject (Scalar bs) = return $ fromStrictByteString bs-bsFromObject _ = fail "Attempt to extract a scalar from non-scalar"--instance ToObject String where- toObject = Scalar . toStrictByteString+class ToObject a => ToScalar a where+ toScalar :: a -> B.ByteString+class FromObject a => FromScalar a where+ fromScalar :: Monad m => B.ByteString -> m a -instance FromObject String where- fromObject = bsFromObject+bsFromObject :: Monad m => Object -> m B.ByteString+bsFromObject (Scalar s) = return s+bsFromObject _ = fail "Attempt to extract a scalar from non-scalar" +instance ToScalar B.ByteString where+ toScalar = id+instance FromScalar B.ByteString where+ fromScalar = return instance ToObject B.ByteString where toObject = Scalar- instance FromObject B.ByteString where fromObject = bsFromObject +instance ToScalar String where+ toScalar = toStrictByteString+instance FromScalar String where+ fromScalar = return . fromStrictByteString+instance ToObject String where+ toObject = Scalar . toScalar+instance FromObject String where+ fromObject o = fromObject o >>= fromScalar+ instance ToObject o => ToObject [o] where toObject = Sequence . map toObject @@ -63,12 +76,12 @@ fromObject (Sequence os) = mapM fromObject os fromObject _ = fail "Attempt to extract a sequence from non-sequence" -instance (StrictByteString bs, ToObject o) => ToObject [(bs, o)] where- toObject = Mapping . map (toStrictByteString *** toObject)+instance (ToScalar bs, ToObject o) => ToObject [(bs, o)] where+ toObject = Mapping . map (toScalar *** toObject) -instance (StrictByteString bs, FromObject o) => FromObject [(bs, o)] where+instance (FromScalar bs, FromObject o) => FromObject [(bs, o)] where fromObject (Mapping pairs) =- mapM (liftSnd . (fromStrictByteString *** fromObject)) pairs+ mapM (liftPair . (fromScalar *** fromObject)) pairs fromObject _ = fail "Attempt to extract a mapping from non-mapping" instance ToObject Object where@@ -77,8 +90,11 @@ instance FromObject Object where fromObject = return -liftSnd :: Monad m => (a, m b) -> m (a, b)-liftSnd (a, b) = b >>= \b' -> return (a, b')+liftPair :: Monad m => (m a, m b) -> m (a, b)+liftPair (a, b) = do+ a' <- a+ b' <- b+ return (a', b') oLookup :: (Monad m, Eq a, Show a, FromObject b) => a -- ^ key@@ -88,3 +104,27 @@ case lookup key pairs of Nothing -> fail $ "Key not found: " ++ show key Just x -> fromObject x++-- helper+readM :: (Read r, Monad m) => String -> m r+readM s = case reads s of+ ((x, _):_) -> return x+ _ -> fail $ "Unable to read: " ++ s+-- instances++instance ToScalar Day where+ toScalar = toStrictByteString . show+instance ToObject Day where+ toObject = toObject . toScalar+instance FromScalar Day where+ fromScalar bs = do+ let s = fromStrictByteString bs+ if length s /= 10+ then fail ("Invalid day: " ++ s)+ else do+ y <- readM $ take 4 s+ m <- readM $ take 2 $ drop 5 s+ d <- readM $ take 2 $ drop 8 s+ return $ fromGregorian y m d+instance FromObject Day where+ fromObject o = fromObject o >>= fromScalar
data-object.cabal view
@@ -1,5 +1,5 @@ name: data-object-version: 0.0.0+version: 0.0.1 license: BSD3 license-file: LICENSE author: Michael Snoyman <michael@snoyman.com>@@ -18,6 +18,7 @@ library build-depends: base >= 4 && < 5, bytestring-class,- bytestring >= 0.9.1.4 && < 1+ bytestring >= 0.9.1.4 && < 1,+ time >= 1 exposed-modules: Data.Object ghc-options: -Wall