+ Ok x -> return x)
+
+readEitherString :: (Monad m) => J.JSValue -> m String
+readEitherString v =
+ case v of
+ J.JSString s -> return $ J.fromJSString s
+ _ -> fail "Wrong JSON type"
+
+loadJSArray :: (Monad m) => String -> m [J.JSObject J.JSValue]
+loadJSArray s = fromJResult $ J.decodeStrict s
+
+fromObj :: (J.JSON a, Monad m) => String -> J.JSObject J.JSValue -> m a
+fromObj k o =
+ case lookup k (J.fromJSObject o) of
+ Nothing -> fail $ printf "key '%s' not found in %s" k (show o)
+ Just val -> fromJResult $ J.readJSON val
+
+getStringElement :: (Monad m) => String -> J.JSObject J.JSValue -> m String
+getStringElement = fromObj
+
+getIntElement :: (Monad m) => String -> J.JSObject J.JSValue -> m Int
+getIntElement = fromObj
+
+getBoolElement :: (Monad m) => String -> J.JSObject J.JSValue -> m Bool
+getBoolElement = fromObj
+
+getListElement :: (Monad m) => String -> J.JSObject J.JSValue -> m [J.JSValue]
+getListElement = fromObj
+
+getObjectElement :: (Monad m) => String -> J.JSObject J.JSValue
+ -> m (J.JSObject J.JSValue)
+getObjectElement = fromObj
+
+asJSObject :: (Monad m) => J.JSValue -> m (J.JSObject J.JSValue)
+asJSObject (J.JSObject a) = return a
+asJSObject _ = fail "not an object"
+
+asObjectList :: (Monad m) => [J.JSValue] -> m [J.JSObject J.JSValue]
+asObjectList = sequence . map asJSObject
+
+-- | Function to concat two strings with a separator under a monad
+(|+) :: (Monad m) => m String -> m String -> m String
+(|+) = liftM2 (\x y -> x ++ "|" ++ y)