packages feed

data-object 0.0.2 → 0.2.0

raw patch · 9 files changed

+670/−172 lines, 9 filesdep +HUnitdep +QuickCheckdep +attemptdep −bytestring-classdep −safedep ~timesetup-changednew-component:exe:runtestsPVP ok

version bump matches the API change (PVP)

Dependencies added: HUnit, QuickCheck, attempt, convertible-text, old-locale, safe-failure, syb, template-haskell, test-framework, test-framework-hunit, test-framework-quickcheck, text

Dependencies removed: bytestring-class, safe

Dependency ranges changed: time

API changes (from Hackage documentation)

- Data.Object: Mapping :: [(key, GenObject key val)] -> GenObject key val
- Data.Object: Scalar :: val -> GenObject key val
- Data.Object: Sequence :: [GenObject key val] -> GenObject key val
- Data.Object: class FromObject a
- Data.Object: class (FromObject a) => FromScalar a
- Data.Object: class ToObject a
- Data.Object: class (ToObject a) => ToScalar a
- Data.Object: data GenObject key val
- Data.Object: fromObject :: (FromObject a, Monad m) => Object -> m a
- Data.Object: fromScalar :: (FromScalar a, Monad m) => ByteString -> m a
- Data.Object: instance [overlap ok] (FromObject o) => FromObject [o]
- Data.Object: instance [overlap ok] (FromScalar bs, FromObject o) => FromObject [(bs, o)]
- Data.Object: instance [overlap ok] (Show key, Show val) => Show (GenObject key val)
- Data.Object: instance [overlap ok] (ToObject o) => ToObject [o]
- Data.Object: instance [overlap ok] (ToScalar bs, ToObject o) => ToObject [(bs, o)]
- Data.Object: instance [overlap ok] FromObject Bool
- Data.Object: instance [overlap ok] FromObject ByteString
- Data.Object: instance [overlap ok] FromObject Day
- Data.Object: instance [overlap ok] FromObject Int
- Data.Object: instance [overlap ok] FromObject Object
- Data.Object: instance [overlap ok] FromObject String
- Data.Object: instance [overlap ok] FromScalar Bool
- Data.Object: instance [overlap ok] FromScalar ByteString
- Data.Object: instance [overlap ok] FromScalar Day
- Data.Object: instance [overlap ok] FromScalar Int
- Data.Object: instance [overlap ok] FromScalar String
- Data.Object: instance [overlap ok] ToObject Bool
- Data.Object: instance [overlap ok] ToObject ByteString
- Data.Object: instance [overlap ok] ToObject Day
- Data.Object: instance [overlap ok] ToObject Int
- Data.Object: instance [overlap ok] ToObject Object
- Data.Object: instance [overlap ok] ToObject String
- Data.Object: instance [overlap ok] ToScalar Bool
- Data.Object: instance [overlap ok] ToScalar ByteString
- Data.Object: instance [overlap ok] ToScalar Day
- Data.Object: instance [overlap ok] ToScalar Int
- Data.Object: instance [overlap ok] ToScalar String
- Data.Object: oLookup :: (Monad m, Eq a, Show a, FromObject b) => a -> [(a, Object)] -> m b
- Data.Object: toObject :: (ToObject a) => a -> Object
- Data.Object: toScalar :: (ToScalar a) => a -> ByteString
- Data.Object: type Object = GenObject ByteString ByteString
+ Data.Object.Base: ExpectedMapping :: ObjectExtractError
+ Data.Object.Base: ExpectedScalar :: ObjectExtractError
+ Data.Object.Base: ExpectedSequence :: ObjectExtractError
+ Data.Object.Base: Mapping :: [(key, Object key val)] -> Object key val
+ Data.Object.Base: Scalar :: val -> Object key val
+ Data.Object.Base: Sequence :: [Object key val] -> Object key val
+ Data.Object.Base: convertObject :: (ConvertSuccess k k', ConvertSuccess v v') => Object k v -> Object k' v'
+ Data.Object.Base: convertObjectM :: (ConvertAttempt k k', ConvertAttempt v v') => Object k v -> Attempt (Object k' v')
+ Data.Object.Base: data Object key val
+ Data.Object.Base: data ObjectExtractError
+ Data.Object.Base: deriveSuccessConvs :: Name -> Name -> [Name] -> [Name] -> Q [Dec]
+ Data.Object.Base: fromMapping :: (MonadFailure ObjectExtractError m) => Object k v -> m [(k, Object k v)]
+ Data.Object.Base: fromScalar :: (MonadFailure ObjectExtractError m) => Object k v -> m v
+ Data.Object.Base: fromSequence :: (MonadFailure ObjectExtractError m) => Object k v -> m [Object k v]
+ Data.Object.Base: instance (Data key, Data val) => Data (Object key val)
+ Data.Object.Base: instance (Eq key, Eq val) => Eq (Object key val)
+ Data.Object.Base: instance (Show key, Show val) => Show (Object key val)
+ Data.Object.Base: instance Applicative (Object key)
+ Data.Object.Base: instance Exception ObjectExtractError
+ Data.Object.Base: instance Foldable (Object key)
+ Data.Object.Base: instance Functor (Object key)
+ Data.Object.Base: instance Monad (Object key)
+ Data.Object.Base: instance Show ObjectExtractError
+ Data.Object.Base: instance Traversable (Object key)
+ Data.Object.Base: instance Typeable ObjectExtractError
+ Data.Object.Base: instance Typeable2 Object
+ Data.Object.Base: lFO :: (ConvertAttempt v' v) => Object k v' -> Attempt [v]
+ Data.Object.Base: lTO :: (ConvertSuccess v v') => [v] -> Object k v'
+ Data.Object.Base: lookupObject :: (ConvertSuccess k' k, ConvertAttempt (Object k v) o, Typeable k, Typeable v, Show k, Eq k) => k' -> [(k, Object k v)] -> Attempt o
+ Data.Object.Base: mFO :: (ConvertAttempt k' k, ConvertAttempt v' v) => Object k' v' -> Attempt [(k, v)]
+ Data.Object.Base: mTO :: (ConvertSuccess k k', ConvertSuccess v v') => [(k, v)] -> Object k' v'
+ Data.Object.Base: mapKeys :: (keyIn -> keyOut) -> Object keyIn val -> Object keyOut val
+ Data.Object.Base: mapKeysValues :: (keyIn -> keyOut) -> (valIn -> valOut) -> Object keyIn valIn -> Object keyOut valOut
+ Data.Object.Base: mapKeysValuesA :: (Applicative f) => (keyIn -> f keyOut) -> (valIn -> f valOut) -> Object keyIn valIn -> f (Object keyOut valOut)
+ Data.Object.Base: mapKeysValuesM :: (Monad m) => (keyIn -> m keyOut) -> (valIn -> m valOut) -> Object keyIn valIn -> m (Object keyOut valOut)
+ Data.Object.Base: mapValues :: (valIn -> valOut) -> Object key valIn -> Object key valOut
+ Data.Object.Base: olFO :: (ConvertAttempt (Object k v) x) => Object k v -> Attempt [x]
+ Data.Object.Base: olTO :: (ConvertSuccess x (Object k v)) => [x] -> Object k v
+ Data.Object.Base: omFO :: (ConvertAttempt k k', ConvertAttempt (Object k v) x) => Object k v -> Attempt [(k', x)]
+ Data.Object.Base: omTO :: (ConvertSuccess k' k, ConvertSuccess x (Object k v)) => [(k', x)] -> Object k v
+ Data.Object.Base: sFO :: (ConvertAttempt v' v) => Object k v' -> Attempt v
+ Data.Object.Base: sTO :: (ConvertSuccess v v') => v -> Object k v'
+ Data.Object.Scalar: Binary :: ByteString -> Scalar
+ Data.Object.Scalar: Bool :: Bool -> Scalar
+ Data.Object.Scalar: Null :: Scalar
+ Data.Object.Scalar: Numeric :: Rational -> Scalar
+ Data.Object.Scalar: Text :: Text -> Scalar
+ Data.Object.Scalar: Timestamp :: UTCTime -> Scalar
+ Data.Object.Scalar: data Scalar
+ Data.Object.Scalar: fromScalarObject :: (ConvertAttempt ScalarObject a) => ScalarObject -> Attempt a
+ Data.Object.Scalar: instance ConvertSuccess Scalar Text
+ Data.Object.Scalar: toScalarObject :: (ConvertSuccess a ScalarObject) => a -> ScalarObject
+ Data.Object.Scalar: type ScalarObject = Object String Scalar
+ Data.Object.String: fromStringObject :: (ConvertAttempt StringObject a) => StringObject -> Attempt a
+ Data.Object.String: instance ConvertAttempt (Object String String) (Object String Bool)
+ Data.Object.String: instance ConvertAttempt (Object String String) (Object String Day)
+ Data.Object.String: instance ConvertAttempt (Object String String) (Object String Int)
+ Data.Object.String: instance ConvertAttempt (Object String String) (Object String Rational)
+ Data.Object.String: instance ConvertAttempt (Object String String) Bool
+ Data.Object.String: instance ConvertAttempt (Object String String) Day
+ Data.Object.String: instance ConvertAttempt (Object String String) Int
+ Data.Object.String: instance ConvertAttempt (Object String String) Rational
+ Data.Object.String: instance ConvertAttempt (Object String String) String
+ Data.Object.String: instance ConvertAttempt (Object String String) [(String, Bool)]
+ Data.Object.String: instance ConvertAttempt (Object String String) [(String, Day)]
+ Data.Object.String: instance ConvertAttempt (Object String String) [(String, Int)]
+ Data.Object.String: instance ConvertAttempt (Object String String) [(String, Object String Bool)]
+ Data.Object.String: instance ConvertAttempt (Object String String) [(String, Object String Day)]
+ Data.Object.String: instance ConvertAttempt (Object String String) [(String, Object String Int)]
+ Data.Object.String: instance ConvertAttempt (Object String String) [(String, Object String Rational)]
+ Data.Object.String: instance ConvertAttempt (Object String String) [(String, Object String String)]
+ Data.Object.String: instance ConvertAttempt (Object String String) [(String, Rational)]
+ Data.Object.String: instance ConvertAttempt (Object String String) [(String, String)]
+ Data.Object.String: instance ConvertAttempt (Object String String) [Bool]
+ Data.Object.String: instance ConvertAttempt (Object String String) [Day]
+ Data.Object.String: instance ConvertAttempt (Object String String) [Int]
+ Data.Object.String: instance ConvertAttempt (Object String String) [Object String Bool]
+ Data.Object.String: instance ConvertAttempt (Object String String) [Object String Day]
+ Data.Object.String: instance ConvertAttempt (Object String String) [Object String Int]
+ Data.Object.String: instance ConvertAttempt (Object String String) [Object String Rational]
+ Data.Object.String: instance ConvertAttempt (Object String String) [Object String String]
+ Data.Object.String: instance ConvertAttempt (Object String String) [Rational]
+ Data.Object.String: instance ConvertAttempt (Object String String) [String]
+ Data.Object.String: instance ConvertSuccess (Object String Bool) (Object String String)
+ Data.Object.String: instance ConvertSuccess (Object String Day) (Object String String)
+ Data.Object.String: instance ConvertSuccess (Object String Int) (Object String String)
+ Data.Object.String: instance ConvertSuccess (Object String Rational) (Object String String)
+ Data.Object.String: instance ConvertSuccess Bool (Object String String)
+ Data.Object.String: instance ConvertSuccess Day (Object String String)
+ Data.Object.String: instance ConvertSuccess Int (Object String String)
+ Data.Object.String: instance ConvertSuccess Rational (Object String String)
+ Data.Object.String: instance ConvertSuccess String (Object String String)
+ Data.Object.String: instance ConvertSuccess [(String, Bool)] (Object String String)
+ Data.Object.String: instance ConvertSuccess [(String, Day)] (Object String String)
+ Data.Object.String: instance ConvertSuccess [(String, Int)] (Object String String)
+ Data.Object.String: instance ConvertSuccess [(String, Object String Bool)] (Object String String)
+ Data.Object.String: instance ConvertSuccess [(String, Object String Day)] (Object String String)
+ Data.Object.String: instance ConvertSuccess [(String, Object String Int)] (Object String String)
+ Data.Object.String: instance ConvertSuccess [(String, Object String Rational)] (Object String String)
+ Data.Object.String: instance ConvertSuccess [(String, Object String String)] (Object String String)
+ Data.Object.String: instance ConvertSuccess [(String, Rational)] (Object String String)
+ Data.Object.String: instance ConvertSuccess [(String, String)] (Object String String)
+ Data.Object.String: instance ConvertSuccess [Bool] (Object String String)
+ Data.Object.String: instance ConvertSuccess [Day] (Object String String)
+ Data.Object.String: instance ConvertSuccess [Int] (Object String String)
+ Data.Object.String: instance ConvertSuccess [Object String Bool] (Object String String)
+ Data.Object.String: instance ConvertSuccess [Object String Day] (Object String String)
+ Data.Object.String: instance ConvertSuccess [Object String Int] (Object String String)
+ Data.Object.String: instance ConvertSuccess [Object String Rational] (Object String String)
+ Data.Object.String: instance ConvertSuccess [Object String String] (Object String String)
+ Data.Object.String: instance ConvertSuccess [Rational] (Object String String)
+ Data.Object.String: instance ConvertSuccess [String] (Object String String)
+ Data.Object.String: toStringObject :: (ConvertSuccess a StringObject) => a -> StringObject
+ Data.Object.String: type StringObject = Object String String
+ Data.Object.Text: data Text :: *
+ Data.Object.Text: fromTextObject :: (ConvertAttempt TextObject a) => TextObject -> Attempt a
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) (Object ByteString Bool)
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) (Object ByteString ByteString)
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) (Object ByteString Day)
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) (Object ByteString Int)
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) (Object ByteString Rational)
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) (Object ByteString String)
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) (Object ByteString Text)
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) (Object String Bool)
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) (Object String ByteString)
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) (Object String Day)
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) (Object String Int)
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) (Object String Rational)
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) (Object String String)
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) (Object String Text)
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) (Object Text Bool)
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) (Object Text ByteString)
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) (Object Text Day)
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) (Object Text Int)
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) (Object Text Rational)
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) (Object Text String)
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) (Object Text Text)
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) Bool
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) ByteString
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) Day
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) Int
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) Rational
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) String
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) Text
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [(ByteString, Bool)]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [(ByteString, ByteString)]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [(ByteString, Day)]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [(ByteString, Int)]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [(ByteString, Object ByteString Bool)]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [(ByteString, Object ByteString ByteString)]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [(ByteString, Object ByteString Day)]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [(ByteString, Object ByteString Int)]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [(ByteString, Object ByteString Rational)]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [(ByteString, Object ByteString String)]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [(ByteString, Object ByteString Text)]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [(ByteString, Object Text Text)]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [(ByteString, Rational)]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [(ByteString, String)]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [(ByteString, Text)]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [(String, Bool)]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [(String, ByteString)]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [(String, Day)]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [(String, Int)]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [(String, Object String Bool)]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [(String, Object String ByteString)]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [(String, Object String Day)]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [(String, Object String Int)]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [(String, Object String Rational)]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [(String, Object String String)]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [(String, Object String Text)]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [(String, Object Text Text)]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [(String, Rational)]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [(String, String)]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [(String, Text)]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [(Text, Bool)]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [(Text, ByteString)]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [(Text, Day)]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [(Text, Int)]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [(Text, Object Text Bool)]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [(Text, Object Text ByteString)]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [(Text, Object Text Day)]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [(Text, Object Text Int)]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [(Text, Object Text Rational)]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [(Text, Object Text String)]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [(Text, Object Text Text)]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [(Text, Rational)]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [(Text, String)]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [(Text, Text)]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [Bool]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [ByteString]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [Day]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [Int]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [Object ByteString Bool]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [Object ByteString ByteString]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [Object ByteString Day]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [Object ByteString Int]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [Object ByteString Rational]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [Object ByteString String]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [Object ByteString Text]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [Object String Bool]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [Object String ByteString]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [Object String Day]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [Object String Int]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [Object String Rational]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [Object String String]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [Object String Text]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [Object Text Bool]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [Object Text ByteString]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [Object Text Day]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [Object Text Int]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [Object Text Rational]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [Object Text String]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [Object Text Text]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [Rational]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [String]
+ Data.Object.Text: instance ConvertAttempt (Object Text Text) [Text]
+ Data.Object.Text: instance ConvertSuccess (Object ByteString Bool) (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess (Object ByteString ByteString) (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess (Object ByteString Day) (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess (Object ByteString Int) (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess (Object ByteString Rational) (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess (Object ByteString String) (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess (Object ByteString Text) (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess (Object String Bool) (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess (Object String ByteString) (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess (Object String Day) (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess (Object String Int) (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess (Object String Rational) (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess (Object String String) (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess (Object String Text) (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess (Object Text Bool) (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess (Object Text ByteString) (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess (Object Text Day) (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess (Object Text Int) (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess (Object Text Rational) (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess (Object Text String) (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess (Object Text Text) (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess Bool (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess ByteString (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess Day (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess Int (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess Rational (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess String (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess Text (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [(ByteString, Bool)] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [(ByteString, ByteString)] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [(ByteString, Day)] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [(ByteString, Int)] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [(ByteString, Object ByteString Bool)] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [(ByteString, Object ByteString ByteString)] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [(ByteString, Object ByteString Day)] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [(ByteString, Object ByteString Int)] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [(ByteString, Object ByteString Rational)] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [(ByteString, Object ByteString String)] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [(ByteString, Object ByteString Text)] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [(ByteString, Object Text Text)] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [(ByteString, Rational)] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [(ByteString, String)] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [(ByteString, Text)] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [(String, Bool)] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [(String, ByteString)] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [(String, Day)] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [(String, Int)] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [(String, Object String Bool)] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [(String, Object String ByteString)] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [(String, Object String Day)] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [(String, Object String Int)] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [(String, Object String Rational)] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [(String, Object String String)] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [(String, Object String Text)] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [(String, Object Text Text)] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [(String, Rational)] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [(String, String)] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [(String, Text)] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [(Text, Bool)] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [(Text, ByteString)] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [(Text, Day)] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [(Text, Int)] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [(Text, Object Text Bool)] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [(Text, Object Text ByteString)] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [(Text, Object Text Day)] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [(Text, Object Text Int)] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [(Text, Object Text Rational)] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [(Text, Object Text String)] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [(Text, Object Text Text)] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [(Text, Rational)] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [(Text, String)] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [(Text, Text)] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [Bool] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [ByteString] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [Day] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [Int] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [Object ByteString Bool] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [Object ByteString ByteString] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [Object ByteString Day] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [Object ByteString Int] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [Object ByteString Rational] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [Object ByteString String] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [Object ByteString Text] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [Object String Bool] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [Object String ByteString] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [Object String Day] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [Object String Int] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [Object String Rational] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [Object String String] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [Object String Text] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [Object Text Bool] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [Object Text ByteString] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [Object Text Day] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [Object Text Int] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [Object Text Rational] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [Object Text String] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [Object Text Text] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [Rational] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [String] (Object Text Text)
+ Data.Object.Text: instance ConvertSuccess [Text] (Object Text Text)
+ Data.Object.Text: toTextObject :: (ConvertSuccess a TextObject) => a -> TextObject
+ Data.Object.Text: type TextObject = Object Text Text

Files

Data/Object.hs view
@@ -1,168 +1,10 @@-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE TypeSynonymInstances #-}-{-# LANGUAGE OverlappingInstances #-}---------------------------------------------------------------- Module        : Data.Object--- Copyright     : Michael Snoyman--- License       : BSD3------ Maintainer    : Michael Snoyman <michael@snoyman.com>--- Stability     : Stable--- Portability   : portable------ These objects show up in different places, eg JSON, Yaml.--- By providing a representation in a separate repository,--- other libraries can share a single representation of--- these structures.-------------------------------------------------------------+-- | Imports all instances provided in this package. module Data.Object-    ( Object-    , GenObject (..)-    , FromObject (..)-    , ToObject (..)-    , FromScalar (..)-    , ToScalar (..)-    , oLookup+    ( module Data.Object.Base     ) where -import qualified Data.ByteString.Lazy as B-import qualified Data.ByteString as BS-import Data.ByteString.Class-import Control.Arrow-import Data.Time.Calendar-import Safe (readMay)--data GenObject key val =-    Mapping [(key, GenObject key val)]-    | Sequence [GenObject key val]-    | Scalar val-    deriving (Show)--type Object = GenObject B.ByteString B.ByteString--class ToObject a where-    toObject :: a -> Object-class FromObject a where-    fromObject :: Monad m => Object -> m a--class ToObject a => ToScalar a where-    toScalar :: a -> B.ByteString-class FromObject a => FromScalar a where-    fromScalar :: Monad m => B.ByteString -> m a--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 BS.ByteString where-    toScalar = toLazyByteString-instance FromScalar BS.ByteString where-    fromScalar = return . fromLazyByteString-instance ToObject BS.ByteString where-    toObject = Scalar . toScalar-instance FromObject BS.ByteString where-    fromObject o = fromObject o >>= fromScalar--instance ToScalar String where-    toScalar = toLazyByteString-instance FromScalar String where-    fromScalar = return . fromLazyByteString-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--instance FromObject o => FromObject [o] where-    fromObject (Sequence os) = mapM fromObject os-    fromObject _ = fail "Attempt to extract a sequence from non-sequence"--instance (ToScalar bs, ToObject o) => ToObject [(bs, o)] where-    toObject = Mapping . map (toScalar *** toObject)--instance (FromScalar bs, FromObject o) => FromObject [(bs, o)] where-    fromObject (Mapping pairs) =-        mapM (liftPair . (fromScalar *** fromObject)) pairs-    fromObject _ = fail "Attempt to extract a mapping from non-mapping"--instance ToObject Object where-    toObject = id--instance FromObject Object where-    fromObject = return--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-        -> [(a, Object)]-        -> m b-oLookup key pairs =-    case lookup key pairs of-        Nothing -> fail $ "Key not found: " ++ show key-        Just x -> fromObject x---- instances--instance ToScalar Day where-    toScalar = toLazyByteString . show-instance ToObject Day where-    toObject = toObject . toScalar-instance FromScalar Day where-    fromScalar bs = do-        let s = fromLazyByteString bs-        if length s /= 10-            then fail ("Invalid day: " ++ s)-            else do-                let x = do-                    y' <- readMay $ take 4 s-                    m' <- readMay $ take 2 $ drop 5 s-                    d' <- readMay $ take 2 $ drop 8 s-                    return (y', m', d')-                case x of-                    Just (y, m, d) -> return $ fromGregorian y m d-                    Nothing -> fail $ "Invalid day: " ++ s-instance FromObject Day where-    fromObject o = fromObject o >>= fromScalar--instance ToScalar Bool where-    toScalar b = toScalar $ if b then "true" else "false"-instance ToObject Bool where-    toObject = toObject . toScalar-instance FromScalar Bool where-    fromScalar bs =-        case fromLazyByteString bs of-            "true" -> return True-            "false" -> return False-            x -> fail $ "Invalid bool value: " ++ x-instance FromObject Bool where-    fromObject o = fromObject o >>= fromScalar+import Data.Object.Base -instance ToScalar Int where-    toScalar = toScalar . show-instance ToObject Int where-    toObject = toObject . toScalar-instance FromScalar Int where-    fromScalar bs =-        case readMay $ fromLazyByteString bs of-            Nothing -> fail $ "Invalid integer: " ++ fromLazyByteString bs-            Just i -> return i-instance FromObject Int where-    fromObject o = fromObject o >>= fromScalar+import Data.Object.String ()+import Data.Object.Text ()+import Data.Object.Scalar ()
+ Data/Object/Base.hs view
@@ -0,0 +1,348 @@+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE ExistentialQuantification #-}+{-# LANGUAGE TemplateHaskell #-}+---------------------------------------------------------+--+-- Module        : Data.Object.Base+-- Copyright     : Michael Snoyman+-- License       : BSD3+--+-- Maintainer    : Michael Snoyman <michael@snoyman.com>+-- Stability     : Stable+-- Portability   : portable+--+-- These objects show up in different places, eg JSON, Yaml.+-- By providing a representation in a separate repository,+-- other libraries can share a single representation of+-- these structures.+--+---------------------------------------------------------++-- | The core of this package is the 'Object' data type, which is used for+-- handling scalars, sequences and mappings in a nested manner. This+-- is the same structure used in JSON or Yaml data.+--+-- The 'Object' data type is polymorphic in its keys and values. Submodules+-- within this package provide more concrete datatypes, such as a 'String'+-- 'Object' and a specialized scalar type.+--+-- Besides the 'Object' data type, there are utility functions and type classes+-- for converting objects around. Care has been taken to avoid any overloaded+-- instances for these type classes.+module Data.Object.Base+    ( -- * Object data type+      Object (..)+      -- * Basic mapping of keys and values+    , mapKeys+    , mapValues+    , mapKeysValues+    , mapKeysValuesA+    , mapKeysValuesM+      -- * Convert entires objects+    , convertObject+    , convertObjectM+      -- * Extracting underlying values+    , ObjectExtractError (..)+    , fromScalar+    , fromSequence+    , fromMapping+      -- * Common object conversions+    , sTO+    , sFO+    , lTO+    , lFO+    , mTO+    , mFO+    , olTO+    , olFO+    , omTO+    , omFO+      -- * Automatic deriving of instances+    , deriveSuccessConvs+      -- * Helper functions+    , lookupObject+      -- * Re-export+    , module Data.Convertible.Text+    ) where++import Control.Arrow+import Control.Applicative+import Control.Monad (ap, (<=<))++import Prelude hiding (mapM, sequence)++import Data.Foldable hiding (concatMap, concat)+import Data.Traversable+import Data.Monoid++import Data.Generics+import qualified Safe.Failure as A+import Control.Exception (Exception)+import Data.Attempt++import Data.Convertible.Text+import Language.Haskell.TH++-- | Can represent nested values as scalars, sequences and mappings.  A+-- sequence is synonymous with a list, while a mapping is synonymous with a+-- list of pairs.+--+-- Note that instances of standard library type classes for this data type+-- leave the key untouched while altering the value. For example, the 'Functor'+-- instance defines 'fmap' to be synonymous with 'mapValues'.+data Object key val =+    Mapping [(key, Object key val)]+    | Sequence [Object key val]+    | Scalar val+    deriving (Show, Eq, Data, Typeable)++instance Functor (Object key) where+    fmap = mapValues++instance Foldable (Object key) where+    foldMap f (Scalar v) = f v+    foldMap f (Sequence vs) = mconcat $ map (foldMap f) vs+    foldMap f (Mapping pairs) = mconcat $ map (foldMap f . snd) pairs++instance Traversable (Object key) where+    traverse f (Scalar v) = Scalar <$> f v+    traverse f (Sequence vs) = Sequence <$> traverse (traverse f) vs+    traverse f (Mapping pairs) =+      Mapping <$> traverse (traverse' (traverse f)) pairs++-- It would be nice if there were an "instance Traversable ((,) a)", but I+-- won't make an orphan instance simply for convenience. Instead:+traverse' :: Applicative f => (a -> f b) -> (x, a) -> f (x, b)+traverse' f (x, a) = (,) x <$> f a++joinObj :: Object key (Object key scalar) -> Object key scalar+joinObj (Scalar x)    = x+joinObj (Sequence xs) = Sequence (map joinObj xs)+joinObj (Mapping  xs) = Mapping  (map (second joinObj) xs)++instance Monad (Object key) where+    return = Scalar+    x >>= f = joinObj . fmap f $ x++instance Applicative (Object key) where+    pure  = Scalar+    (<*>) = ap++-- | Apply some conversion to the keys of an 'Object', leaving the values+-- unchanged.+mapKeys :: (keyIn -> keyOut) -> Object keyIn val -> Object keyOut val+mapKeys = flip mapKeysValues id++-- | Apply some conversion to the values of an 'Object', leaving the keys+-- unchanged. This is equivalent to 'fmap'.+mapValues :: (valIn -> valOut) -> Object key valIn -> Object key valOut+mapValues = mapKeysValues id++-- | Apply a conversion to both the keys and values of an 'Object'.+mapKeysValues :: (keyIn -> keyOut)+              -> (valIn -> valOut)+              -> Object keyIn valIn+              -> Object keyOut valOut+mapKeysValues _ fv (Scalar v) = Scalar $ fv v+mapKeysValues fk fv (Sequence os)= Sequence $ map (mapKeysValues fk fv) os+mapKeysValues fk fv (Mapping pairs) =+    Mapping $ map (fk *** mapKeysValues fk fv) pairs++-- | Apply an 'Applicative' conversion to both the keys and values of an+-- 'Object'.+mapKeysValuesA :: Applicative f+               => (keyIn -> f keyOut)+               -> (valIn -> f valOut)+               -> Object keyIn valIn+               -> f (Object keyOut valOut)+mapKeysValuesA _ fv (Scalar v) = Scalar <$> fv v+mapKeysValuesA fk fv (Sequence os) =+    Sequence <$> traverse (mapKeysValuesA fk fv) os+mapKeysValuesA fk fv (Mapping pairs) = Mapping <$>+    traverse (uncurry (liftA2 (,)) . (fk *** mapKeysValuesA fk fv)) pairs++-- | The same as 'mapKeysValuesA', but using a 'Monad' since some people are+-- more comfortable with 'Monad's and not all 'Monad's are 'Applicative'.+mapKeysValuesM :: Monad m+               => (keyIn -> m keyOut)+               -> (valIn -> m valOut)+               -> Object keyIn valIn+               -> m (Object keyOut valOut)+mapKeysValuesM fk fv =+    let fk' = WrapMonad . fk+        fv' = WrapMonad . fv+     in unwrapMonad . mapKeysValuesA fk' fv'++convertObject :: (ConvertSuccess k k', ConvertSuccess v v')+              => Object k v+              -> Object k' v'+convertObject = mapKeysValues cs cs++convertObjectM :: (ConvertAttempt k k', ConvertAttempt v v')+               => Object k v+               -> Attempt (Object k' v')+convertObjectM = mapKeysValuesM ca ca++-- | An error value returned when an unexpected node is encountered, eg you+-- were expecting a 'Scalar' and found a 'Mapping'.+data ObjectExtractError =+    ExpectedScalar+    | ExpectedSequence+    | ExpectedMapping+    deriving (Typeable, Show)+instance Exception ObjectExtractError++-- | Extra a scalar from the input, failing if the input is a sequence or+-- mapping.+fromScalar :: MonadFailure ObjectExtractError m => Object k v -> m v+fromScalar (Scalar s) = return s+fromScalar _ = failure ExpectedScalar++-- | Extra a sequence from the input, failing if the input is a scalar or+-- mapping.+fromSequence :: MonadFailure ObjectExtractError m+             => Object k v+             -> m [Object k v]+fromSequence (Sequence s) = return s+fromSequence _ = failure ExpectedSequence++-- | Extra a mapping from the input, failing if the input is a scalar or+-- sequence.+fromMapping :: MonadFailure ObjectExtractError m+            => Object k v+            -> m [(k, Object k v)]+fromMapping (Mapping m) = return m+fromMapping _ = failure ExpectedMapping++sTO :: ConvertSuccess v v' => v -> Object k v'+sTO = Scalar . cs++sFO :: ConvertAttempt v' v => Object k v' -> Attempt v+sFO = ca <=< fromScalar++lTO :: ConvertSuccess v v' => [v] -> Object k v'+lTO = Sequence . map (Scalar . cs)++lFO :: ConvertAttempt v' v => Object k v' -> Attempt [v]+lFO = mapM (ca <=< fromScalar) <=< fromSequence++mTO :: (ConvertSuccess k k', ConvertSuccess v v')+                => [(k, v)]+                -> Object k' v'+mTO = Mapping . map (cs *** Scalar . cs)++mFO :: (ConvertAttempt k' k, ConvertAttempt v' v)+                  => Object k' v'+                  -> Attempt [(k, v)]+mFO =+    mapM (runKleisli (Kleisli ca *** Kleisli sFO))+ <=< fromMapping++olTO :: ConvertSuccess x (Object k v) => [x] -> Object k v+olTO = Sequence . map cs++olFO :: ConvertAttempt (Object k v) x => Object k v -> Attempt [x]+olFO = mapM ca <=< fromSequence++omTO :: (ConvertSuccess k' k, ConvertSuccess x (Object k v))+                 => [(k', x)]+                 -> Object k v+omTO = Mapping . map (cs *** cs)++omFO :: (ConvertAttempt k k', ConvertAttempt (Object k v) x)+                   => Object k v+                   -> Attempt [(k', x)]+omFO = mapM (runKleisli (Kleisli ca *** Kleisli ca)) <=< fromMapping++deriveSuccessConvs :: Name -- ^ dest key+                   -> Name -- ^ dest value+                   -> [Name] -- ^ source keys+                   -> [Name] -- ^ source values+                   -> Q [Dec]+deriveSuccessConvs dk dv sks svs = do+    sto <- [|sTO|]+    sfo <- [|sFO|]+    lto <- [|lTO|]+    lfo <- [|lFO|]+    mto <- [|mTO|]+    mfo <- [|mFO|]+    olto <- [|olTO|]+    olfo <- [|olFO|]+    omto <- [|omTO|]+    omfo <- [|omFO|]+    co <- [|convertObject|]+    coa <- [|convertObjectM|]+    let sks' = map ConT sks+        svs' = map ConT svs+        pairs = do+            sk <- sks'+            sv <- svs'+            return (sk, sv)+    let valOnly = concatMap (helper1 sto sfo lto lfo) svs'+        both = concatMap (helper2 mto mfo olto olfo co coa omto omfo) pairs+        keyOnly = concatMap (helper3 omto omfo) sks'+    return $ valOnly ++ both ++ keyOnly+      where+        dk' = ConT dk+        dv' = ConT dv+        objectt k v = ConT (mkName "Object") `AppT` k `AppT` v+        to' src = ConT (mkName "ConvertSuccess") `AppT` src `AppT`+                  objectt dk' dv'+        fo' dst = ConT (mkName "ConvertAttempt") `AppT`+                  objectt dk' dv' `AppT` dst+        cs' = mkName "convertSuccess"+        ca' = mkName "convertAttempt"+        to src f =+            InstanceD [] (to' src) [FunD cs' [Clause [] (NormalB f) []]]+        fo dst f =+            InstanceD [] (fo' dst) [FunD ca' [Clause [] (NormalB f) []]]+        tofo ty x y = [to ty x, fo ty y]+        listt = AppT ListT+        pairt k v = TupleT 2 `AppT` k `AppT` v+        helper1 sto sfo lto lfo sv = concat+            [ tofo sv sto sfo+            , tofo (listt sv) lto lfo+            ]+        helper2 mto mfo olto olfo co coa omto omfo (sk, sv) = concat+            [ tofo (listt $ pairt sk sv) mto mfo+            , tofo (listt $ objectt sk sv) olto olfo+            , if sk == dk' && sv == dv' -- avoid overlapping with identity+                then []+                else tofo (objectt sk sv) co coa+            , if sk == dk' && sv == dv' -- avoid overlapping with helper3+                then []+                else tofo (listt $ pairt sk $ objectt sk sv) omto omfo+            ]+        helper3 omto omfo sk = concat+            [ tofo (listt $ pairt sk $ objectt dk' dv') omto omfo+            ]++-- | An equivalent of 'lookup' to deal specifically with maps of 'Object's. In+-- particular, it will:+--+-- 1. Automatically convert the lookup key as necesary. For example- assuming+-- you have the appropriate 'ConvertSuccess' instances, you could lookup an 'Int' in+-- a map that has 'String' keys.+--+-- 2. Return the result in an 'Attempt', not 'Maybe'. This is especially useful+-- when creating 'FromObject' instances.+--+-- 3. Show a more useful error message. Since this function requires the key to+-- be 'Show'able, the fail message states what key was not found.+--+-- 4. Calls 'fromObject' automatically, so you get out the value type that you+-- want, not just an 'Object'.+lookupObject :: ( ConvertSuccess k' k+                , ConvertAttempt (Object k v) o+                , Typeable k+                , Typeable v+                , Show k+                , Eq k+                )+             => k'+             -> [(k, Object k v)]+             -> Attempt o+lookupObject key = ca <=< A.lookup (convertSuccess key)
+ Data/Object/Scalar.hs view
@@ -0,0 +1,65 @@+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE TypeSynonymInstances #-}+---------------------------------------------------------+--+-- Module        : Data.Object.Scalar+-- Copyright     : Michael Snoyman+-- License       : BSD3+--+-- Maintainer    : Michael Snoyman <michael@snoyman.com>+-- Stability     : Stable+-- Portability   : portable+---------------------------------------------------------+module Data.Object.Scalar+    ( Scalar (..)+    , ScalarObject+    , toScalarObject+    , fromScalarObject+    , module Data.Object.Base+    ) where++import Data.ByteString.Lazy (ByteString, empty)+import Data.Time.Clock (UTCTime)+import Data.Object.Text+import Data.Object.Base+import System.Locale (defaultTimeLocale)+import Data.Time.Format (formatTime)+import Data.Attempt+import Data.Convertible.Text++data Scalar = Numeric   Rational+            | Text      Text+            | Binary    ByteString+            | Bool      Bool+            | Timestamp UTCTime+            | Null++type ScalarObject = Object String Scalar++instance ConvertSuccess Scalar Text where+    convertSuccess (Numeric n) = convertSuccess $ show n+    convertSuccess (Text t) = t+    convertSuccess (Binary b) = convertSuccess b+    convertSuccess (Bool True) = convertSuccess "true"+    convertSuccess (Bool False) = convertSuccess "false"+    -- this is W3 format for timestamps.+    convertSuccess (Timestamp t) =+        convertSuccess $ formatTime defaultTimeLocale "%FT%XZ" t+    convertSuccess Null = convertSuccess empty++{- FIXME write a real conversion here+instance ConvertSuccess Text Scalar where+    convertSuccess = Text+-}++-- | 'toObject' specialized for 'ScalarObject's+toScalarObject :: ConvertSuccess a ScalarObject => a -> ScalarObject+toScalarObject = cs++-- | 'fromObject' specialized for 'ScalarObject's+fromScalarObject :: ConvertAttempt ScalarObject a+                 => ScalarObject+                 -> Attempt a+fromScalarObject = ca
+ Data/Object/String.hs view
@@ -0,0 +1,46 @@+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE TypeSynonymInstances #-}+{-# LANGUAGE TemplateHaskell #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+---------------------------------------------------------+--+-- Module        : Data.Object.String+-- Copyright     : Michael Snoyman+-- License       : BSD3+--+-- Maintainer    : Michael Snoyman <michael@snoyman.com>+-- Stability     : Stable+-- Portability   : portable+--+-- Objects with 'String's for keys and values.+---------------------------------------------------------++module Data.Object.String+    ( StringObject+    , toStringObject+    , fromStringObject+    , module Data.Object.Base+    ) where++import Data.Object.Base+import Data.Attempt++import Data.Time.Calendar++type StringObject = Object String String++-- | 'toObject' specialized for 'StringObject's+toStringObject :: ConvertSuccess a StringObject => a -> StringObject+toStringObject = cs++-- | 'fromObject' specialized for 'StringObject's+fromStringObject :: ConvertAttempt StringObject a+                 => StringObject+                 -> Attempt a+fromStringObject = ca++$(deriveSuccessConvs ''String ''String+    [''String]+    [''String, ''Day, ''Int, ''Rational, ''Bool])
+ Data/Object/Text.hs view
@@ -0,0 +1,146 @@+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE TypeSynonymInstances #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE TemplateHaskell #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+---------------------------------------------------------+--+-- Module        : Data.Object.Text+-- Copyright     : Michael Snoyman+-- License       : BSD3+--+-- Maintainer    : Michael Snoyman <michael@snoyman.com>+-- Stability     : Stable+-- Portability   : portable+---------------------------------------------------------++-- | Keys and values are lazy 'Text's.+module Data.Object.Text+    ( TextObject+    , toTextObject+    , fromTextObject+    , Text+    , module Data.Object.Base+#if TEST+    , testSuite+#endif+    ) where++import Data.Object.Base+import Data.Text.Lazy (Text)+import Data.Attempt++import Data.Time.Calendar++import qualified Data.ByteString as BS+import qualified Data.ByteString.Lazy as BL+import qualified Data.Text as TS++#if TEST+import Test.Framework (testGroup, Test)+import Test.Framework.Providers.HUnit+import Test.Framework.Providers.QuickCheck (testProperty)+import Test.HUnit hiding (Test)+import Test.QuickCheck++import Control.Arrow ((***))+import Data.Convertible.Text+#endif++-- | 'Object's with keys and values of type 'Text'.+type TextObject = Object Text Text++-- | 'convertSuccess' specialized for 'TextObject's+toTextObject :: ConvertSuccess a TextObject => a -> TextObject+toTextObject = cs++-- | 'convertAttempt' specialized for 'TextObject's+fromTextObject :: ConvertAttempt TextObject a => TextObject -> Attempt a+fromTextObject = ca++$(deriveSuccessConvs ''Text ''Text+    [''Text, ''String, ''BS.ByteString, ''BL.ByteString, ''TS.Text]+    [''String, ''Day, ''Int, ''Rational, ''Bool, ''BS.ByteString,+     ''BL.ByteString, ''TS.Text, ''Text+    ])++#if TEST+testSuite :: Test+testSuite = testGroup "Data.Object.Text"+    [ testProperty "propMapKeysValuesId" propMapKeysValuesId+    , testProperty "propToFromTextObject" propToFromTextObject+    , testProperty "propStrings" propStrings+    , testCase "autoScalar" autoScalar+    , testCase "autoMapping" autoMapping+    ]++propMapKeysValuesId :: Object Int Int -> Bool+propMapKeysValuesId o = mapKeysValues id id o == o++-- FIXME consider making something automatic, though unlikely+instance ConvertAttempt TextObject (Object Int Int) where+    convertAttempt = convertObjectM+instance ConvertSuccess (Object Int Int) TextObject where+    convertSuccess = convertObject++propToFromTextObject :: Object Int Int -> Bool+propToFromTextObject o = fa (fromTextObject (toTextObject o)) == Just o++instance Arbitrary (Object Int Int) where+    coarbitrary = undefined+    arbitrary = oneof [arbS, arbL, arbM] where+        arbS = Scalar `fmap` (arbitrary :: Gen Int)+        arbL = Sequence `fmap` vector 2+        arbM = Mapping `fmap` vector 1++instance Arbitrary Char where+    coarbitrary = undefined+    arbitrary = elements $ ['A'..'Z'] ++ ['a'..'z'] ++ ['0'..'9']++propStrings :: String -> Bool+propStrings s = fa (sFO $ (sTO s :: TextObject)) == Just s++autoScalar :: Assertion+autoScalar = do+    let t :: Text+        t = cs "This is some text"+    Scalar t @=? toTextObject t++autoMapping :: Assertion+autoMapping = do+    let dummy = [("foo", "FOO"), ("bar", "BAR"), ("five", "5")]+        expected :: TextObject+        expected = Mapping $ map (cs *** Scalar . cs) dummy+    let test' :: (ConvertSuccess String a,+                  ConvertSuccess a Text,+                  ConvertSuccess Text a,+                  Eq a,+                  Show a,+                  ConvertSuccess a TextObject,+                  ConvertAttempt TextObject a,+                  ConvertSuccess [a] TextObject,+                  ConvertAttempt TextObject [a],+                  ConvertSuccess [(a, a)] TextObject,+                  ConvertAttempt TextObject [(a, a)],+                  ConvertSuccess [TextObject] TextObject,+                  ConvertAttempt TextObject [TextObject],+                  ConvertSuccess [(a, TextObject)] TextObject,+                  ConvertAttempt TextObject [(a, TextObject)])+             => a -> Assertion+        test' a = do+            let dummy' = map (cs *** cs) dummy `asTypeOf` [(a, a)]+                dummy'' = toTextObject dummy'+            dummy'' @?= expected+            Just dummy' @=? fa (fromTextObject expected)+            let dummyO = map (cs *** toTextObject) dummy `asTypeOf`+                            [(a, undefined :: TextObject)]+            expected @=? toTextObject dummyO+            Just dummyO @=? fa (fromTextObject expected)+    test' (undefined :: String)+    test' (undefined :: Text)+    test' (undefined :: BS.ByteString)+    test' (undefined :: BL.ByteString)+#endif
LICENSE view
@@ -1,7 +1,7 @@ The following license covers this documentation, and the source code, except where otherwise indicated. -Copyright 2008, Michael Snoyman. All rights reserved.+Copyright 2009, Michael Snoyman. All rights reserved.  Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
Setup.lhs view
@@ -2,6 +2,10 @@  > module Main where > import Distribution.Simple+> import System.Cmd (system)  > main :: IO ()-> main = defaultMain+> main = defaultMainWithHooks (simpleUserHooks { runTests = runTests' })++> runTests' :: a -> b -> c -> d -> IO ()+> runTests' _ _ _ _ = system "runhaskell Test.hs" >> return ()
data-object.cabal view
@@ -1,8 +1,8 @@ name:            data-object-version:         0.0.2+version:         0.2.0 license:         BSD3 license-file:    LICENSE-author:          Michael Snoyman <michael@snoyman.com>+author:          Michael Snoyman, Nicolas Pouillard maintainer:      Michael Snoyman <michael@snoyman.com> synopsis:        Represent hierachichal structures, called objects in JSON. description:     These objects show up in different places, eg JSON, Yaml.@@ -10,16 +10,51 @@                  other libraries can share a single representation of                  these structures. category:        Data-stability:       unstable+stability:       Stable cabal-version:   >= 1.2 build-type:      Simple homepage:        http://github.com/snoyberg/data-object/tree/master +flag buildtests+  description: Build the executable to run unit tests+  default: False++flag nolib+  description: Skip building the library.+  default: False+ library+    if flag(nolib)+        Buildable: False+    else+        Buildable: True     build-depends:   base >= 4 && < 5,-                     bytestring-class,                      bytestring >= 0.9.1.4 && < 1,-                     time >= 1,-                     safe+                     text >= 0.5 && < 0.6,+                     time >= 1.1.4 && < 1.2,+                     safe-failure >= 0.4 && < 0.5,+                     old-locale >= 1 && < 1.1,+                     syb,+                     attempt >= 0.2.0 && < 0.3,+                     convertible-text >= 0.2.0 && < 0.3,+                     template-haskell     exposed-modules: Data.Object+                     Data.Object.Base+                     Data.Object.Text+                     Data.Object.Scalar+                     Data.Object.String     ghc-options:     -Wall++executable           runtests+    if flag(buildtests)+        Buildable: True+        cpp-options:     -DTEST+        build-depends:   test-framework,+                         test-framework-quickcheck,+                         test-framework-hunit,+                         HUnit,+                         QuickCheck >= 1 && < 2+    else+        Buildable: False+    ghc-options:     -Wall+    main-is:         runtests.hs
+ runtests.hs view
@@ -0,0 +1,12 @@+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}++import Test.Framework (defaultMain)++import qualified Data.Object.Text++main :: IO ()+main = defaultMain+    [ Data.Object.Text.testSuite+    ]