packages feed

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 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