data-object 0.2.1 → 0.3.0
raw patch · 8 files changed
+206/−691 lines, 8 filesdep +failuredep −HUnitdep −QuickCheckdep −attemptsetup-changedPVP ok
version bump matches the API change (PVP)
Dependencies added: failure
Dependencies removed: HUnit, QuickCheck, attempt, convertible-text, old-locale, safe-failure, syb, template-haskell, test-framework, test-framework-hunit, test-framework-quickcheck
API changes (from Hackage documentation)
- 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: lookupMapping :: (MonadFailure ObjectExtractError m, Failure (LookupFailure k) m, Eq k) => k -> [(k, Object k v)] -> m [(k, 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: lookupScalar :: (MonadFailure ObjectExtractError m, Failure (LookupFailure k) m, Eq k) => k -> [(k, Object k v)] -> m v
- Data.Object.Base: lookupSequence :: (MonadFailure ObjectExtractError m, Failure (LookupFailure k) m, Eq k) => k -> [(k, Object k v)] -> m [Object k v]
- 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
+ Data.Object: Binary :: ByteString -> Scalar
+ Data.Object: Bool :: Bool -> Scalar
+ Data.Object: ExpectedMapping :: ObjectExtractError
+ Data.Object: ExpectedScalar :: ObjectExtractError
+ Data.Object: ExpectedSequence :: ObjectExtractError
+ Data.Object: Mapping :: [(key, Object key val)] -> Object key val
+ Data.Object: Null :: Scalar
+ Data.Object: Numeric :: Rational -> Scalar
+ Data.Object: Scalar :: val -> Object key val
+ Data.Object: Sequence :: [Object key val] -> Object key val
+ Data.Object: Text :: Text -> Scalar
+ Data.Object: Timestamp :: UTCTime -> Scalar
+ Data.Object: data Object key val
+ Data.Object: data ObjectExtractError
+ Data.Object: data Scalar
+ Data.Object: fromMapping :: (Failure ObjectExtractError m) => Object k v -> m [(k, Object k v)]
+ Data.Object: fromScalar :: (Failure ObjectExtractError m) => Object k v -> m v
+ Data.Object: fromSequence :: (Failure ObjectExtractError m) => Object k v -> m [Object k v]
+ Data.Object: instance (Data key, Data val) => Data (Object key val)
+ Data.Object: instance (Eq key, Eq val) => Eq (Object key val)
+ Data.Object: instance (Show key, Show val) => Show (Object key val)
+ Data.Object: instance Applicative (Object key)
+ Data.Object: instance Exception ObjectExtractError
+ Data.Object: instance Foldable (Object key)
+ Data.Object: instance Functor (Object key)
+ Data.Object: instance Monad (Object key)
+ Data.Object: instance Show ObjectExtractError
+ Data.Object: instance Traversable (Object key)
+ Data.Object: instance Typeable ObjectExtractError
+ Data.Object: instance Typeable2 Object
+ Data.Object: mapKeys :: (keyIn -> keyOut) -> Object keyIn val -> Object keyOut val
+ Data.Object: mapKeysValues :: (keyIn -> keyOut) -> (valIn -> valOut) -> Object keyIn valIn -> Object keyOut valOut
+ Data.Object: mapKeysValuesA :: (Applicative f) => (keyIn -> f keyOut) -> (valIn -> f valOut) -> Object keyIn valIn -> f (Object keyOut valOut)
+ Data.Object: mapKeysValuesM :: (Monad m) => (keyIn -> m keyOut) -> (valIn -> m valOut) -> Object keyIn valIn -> m (Object keyOut valOut)
+ Data.Object: mapValues :: (valIn -> valOut) -> Object key valIn -> Object key valOut
+ Data.Object: type ScalarObject = Object String Scalar
+ Data.Object: type StringObject = Object String String
+ Data.Object: type TextObject = Object Text Text
Files
- Data/Object.hs +203/−6
- Data/Object/Base.hs +0/−375
- Data/Object/Scalar.hs +0/−64
- Data/Object/String.hs +0/−46
- Data/Object/Text.hs +0/−146
- Setup.lhs +1/−5
- data-object.cabal +2/−37
- runtests.hs +0/−12
Data/Object.hs view
@@ -1,10 +1,207 @@--- | Imports all instances provided in this package.+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE ExistentialQuantification #-}+{-# LANGUAGE TemplateHaskell #-}+---------------------------------------------------------+--+-- 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.+--+---------------------------------------------------------++-- | 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- ( module Data.Object.Base+ ( -- * Object data type+ Object (..)+ -- ** Convenient type synonyms+ , StringObject+ , TextObject+ -- ** Scalar data type+ , Scalar (..)+ , ScalarObject+ -- * Basic mapping of keys and values+ , mapKeys+ , mapValues+ , mapKeysValues+ , mapKeysValuesA+ , mapKeysValuesM+ -- * Extracting underlying values+ , ObjectExtractError (..)+ , fromScalar+ , fromSequence+ , fromMapping ) where -import Data.Object.Base+import Control.Arrow+import Control.Applicative+import Control.Monad (ap) -import Data.Object.String ()-import Data.Object.Text ()-import Data.Object.Scalar ()+import Prelude hiding (mapM, sequence)++import Data.Foldable hiding (concatMap, concat)+import Data.Traversable+import Data.Monoid++import Control.Exception (Exception)+import Data.Data (Data, Typeable)+import Control.Failure+import Data.Text (Text)+import Data.Time (UTCTime)+import Data.ByteString (ByteString)++-- | 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)++type StringObject = Object String String++-- | 'Object's with keys and values of strict 'Text'.+type TextObject = Object Text Text++data Scalar = Numeric Rational+ | Text Text+ | Binary ByteString+ | Bool Bool+ | Timestamp UTCTime+ | Null++type ScalarObject = Object String Scalar++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'++-- | 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++-- | Extract a scalar from the input, failing if the input is a sequence or+-- mapping.+fromScalar :: Failure ObjectExtractError m => Object k v -> m v+fromScalar (Scalar s) = return s+fromScalar _ = failure ExpectedScalar++-- | Extract a sequence from the input, failing if the input is a scalar or+-- mapping.+fromSequence :: Failure ObjectExtractError m+ => Object k v+ -> m [Object k v]+fromSequence (Sequence s) = return s+fromSequence _ = failure ExpectedSequence++-- | Extract a mapping from the input, failing if the input is a scalar or+-- sequence.+fromMapping :: Failure ObjectExtractError m+ => Object k v+ -> m [(k, Object k v)]+fromMapping (Mapping m) = return m+fromMapping _ = failure ExpectedMapping
− Data/Object/Base.hs
@@ -1,375 +0,0 @@-{-# 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- , lookupScalar- , lookupSequence- , lookupMapping- -- * 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)--lookupScalar :: ( MonadFailure ObjectExtractError m- , Failure (A.LookupFailure k) m- , Eq k)- => k- -> [(k, Object k v)]- -> m v-lookupScalar key = fromScalar <=< A.lookup key--lookupSequence :: ( MonadFailure ObjectExtractError m- , Failure (A.LookupFailure k) m- , Eq k)- => k- -> [(k, Object k v)]- -> m [Object k v]-lookupSequence key = fromSequence <=< A.lookup key--lookupMapping :: ( MonadFailure ObjectExtractError m- , Failure (A.LookupFailure k) m- , Eq k)- => k- -> [(k, Object k v)]- -> m [(k, Object k v)]-lookupMapping key = fromMapping <=< A.lookup key
− Data/Object/Scalar.hs
@@ -1,64 +0,0 @@-{-# 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--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
@@ -1,46 +0,0 @@-{-# 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
@@ -1,146 +0,0 @@-{-# 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
Setup.lhs view
@@ -2,10 +2,6 @@ > module Main where > import Distribution.Simple-> import System.Cmd (system) > main :: IO ()-> main = defaultMainWithHooks (simpleUserHooks { runTests = runTests' })--> runTests' :: a -> b -> c -> d -> IO ()-> runTests' _ _ _ _ = system "runhaskell Test.hs" >> return ()+> main = defaultMain
data-object.cabal view
@@ -1,5 +1,5 @@ name: data-object-version: 0.2.1+version: 0.3.0 license: BSD3 license-file: LICENSE author: Michael Snoyman, Nicolas Pouillard@@ -15,46 +15,11 @@ 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 >= 0.9.1.4 && < 1, text >= 0.5 && < 0.8, 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+ failure >= 0.1.0 && < 0.2 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
@@ -1,12 +0,0 @@-{-# 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- ]