on master help sign in
Clean up warnings
ae4e105Michael Snoyman
Data/Yaml.hs+7−8
@@ -71,7 +71,6 @@ module Data.Yaml
71import Control.Applicative((<$>))
71import Control.Applicative((<$>))
72#endif
72#endif
73import Control.Exception
73import Control.Exception
74−import Control.Monad.Trans.Resource (runResourceT)
75import Data.Aeson
74import Data.Aeson
76 ( Value (..), ToJSON (..), FromJSON (..), object
75 ( Value (..), ToJSON (..), FromJSON (..), object
77 , (.=) , (.:) , (.:?) , (.!=)
76 , (.=) , (.:) , (.:?) , (.!=)
@@ -85,7 +84,7 @@ import Data.Aeson.Encode (encodeToTextBuilder)
85#endif
84#endif
86import Data.Aeson.Types (Pair, parseMaybe, parseEither, Parser)
85import Data.Aeson.Types (Pair, parseMaybe, parseEither, Parser)
87import Data.ByteString (ByteString)
86import Data.ByteString (ByteString)
88−import qualified Data.Conduit as C
87+import Data.Conduit ((.|), runConduitRes)
89import qualified Data.Conduit.List as CL
88import qualified Data.Conduit.List as CL
90import qualified Data.HashMap.Strict as M
89import qualified Data.HashMap.Strict as M
91import qualified Data.HashSet as HashSet
90import qualified Data.HashSet as HashSet
@@ -101,14 +100,14 @@ import Text.Libyaml hiding (encode, decode, encodeFile, decodeFile)
101import qualified Text.Libyaml as Y
100import qualified Text.Libyaml as Y
102
101
103encode :: ToJSON a => a -> ByteString
102encode :: ToJSON a => a -> ByteString
104−encode obj = unsafePerformIO $
103+encode obj = unsafePerformIO $ runConduitRes
105− runResourceT $ CL.sourceList (objToEvents $ toJSON obj)
104+ $ CL.sourceList (objToEvents $ toJSON obj)
106− C.$$ Y.encode
105+ .| Y.encode
107
106
108encodeFile :: ToJSON a => FilePath -> a -> IO ()
107encodeFile :: ToJSON a => FilePath -> a -> IO ()
109−encodeFile fp obj = runResourceT
108+encodeFile fp obj = runConduitRes
110− $ CL.sourceList (objToEvents $ toJSON obj)
109+ $ CL.sourceList (objToEvents $ toJSON obj)
111− C.$$ Y.encodeFile fp
110+ .| Y.encodeFile fp
112
111
113objToEvents :: Value -> [Y.Event]
112objToEvents :: Value -> [Y.Event]
114objToEvents o = (:) EventStreamStart
113objToEvents o = (:) EventStreamStart
Data/Yaml/Builder.hs+3−4
@@ -21,7 +21,6 @@ module Data.Yaml.Builder
21import Prelude hiding (null)
21import Prelude hiding (null)
22
22
23import Control.Arrow (second)
23import Control.Arrow (second)
24−import Control.Monad.Trans.Resource (runResourceT)
25#if MIN_VERSION_aeson(1,0,0)
24#if MIN_VERSION_aeson(1,0,0)
26import Data.Aeson.Text (encodeToTextBuilder)
25import Data.Aeson.Text (encodeToTextBuilder)
27#else
26#else
@@ -107,11 +106,11 @@ toEvents :: YamlBuilder -> [Event]
107toEvents (YamlBuilder front) =
106toEvents (YamlBuilder front) =
108 EventStreamStart : EventDocumentStart : front [EventDocumentEnd, EventStreamEnd]
107 EventStreamStart : EventDocumentStart : front [EventDocumentEnd, EventStreamEnd]
109
108
110−toSource :: (Monad m, ToYaml a) => a -> Source m Event
109+toSource :: (Monad m, ToYaml a) => a -> ConduitM i Event m ()
111toSource = mapM_ yield . toEvents . toYaml
110toSource = mapM_ yield . toEvents . toYaml
112
111
113toByteString :: ToYaml a => a -> ByteString
112toByteString :: ToYaml a => a -> ByteString
114−toByteString yb = unsafePerformIO $ runResourceT $ toSource yb $$ encode
113+toByteString yb = unsafePerformIO $ runConduitRes $ toSource yb .| encode
115
114
116writeYamlFile :: ToYaml a => FilePath -> a -> IO ()
115writeYamlFile :: ToYaml a => FilePath -> a -> IO ()
117−writeYamlFile fp yb = runResourceT $ toSource yb $$ encodeFile fp
116+writeYamlFile fp yb = runConduitRes $ toSource yb .| encodeFile fp
Data/Yaml/Include.hs+4−4
@@ -27,19 +27,19 @@ import qualified Text.Libyaml as Y
27eventsFromFile
27eventsFromFile
28 :: MonadResource m
28 :: MonadResource m
29 => FilePath
29 => FilePath
30− -> Producer m Event
30+ -> ConduitM i Event m ()
31eventsFromFile = go []
31eventsFromFile = go []
32 where
32 where
33− go :: MonadResource m => [FilePath] -> FilePath -> Producer m Event
33+ go :: MonadResource m => [FilePath] -> FilePath -> ConduitM i Event m ()
34 go seen fp = do
34 go seen fp = do
35 cfp <- liftIO $ handleNotFound $ canonicalizePath fp
35 cfp <- liftIO $ handleNotFound $ canonicalizePath fp
36 when (cfp `elem` seen) $ do
36 when (cfp `elem` seen) $ do
37 liftIO $ throwIO CyclicIncludes
37 liftIO $ throwIO CyclicIncludes
38− Y.decodeFile cfp $= do
38+ Y.decodeFile cfp .| do
39 awaitForever $ \event -> case event of
39 awaitForever $ \event -> case event of
40 EventScalar f (UriTag "!include") _ _ -> do
40 EventScalar f (UriTag "!include") _ _ -> do
41 let includeFile = takeDirectory cfp </> unpack (decodeUtf8 f)
41 let includeFile = takeDirectory cfp </> unpack (decodeUtf8 f)
42− go (cfp : seen) includeFile $= CL.filter (`notElem` irrelevantEvents)
42+ go (cfp : seen) includeFile .| CL.filter (`notElem` irrelevantEvents)
43 _ -> yield event
43 _ -> yield event
44
44
45 irrelevantEvents = [EventStreamStart, EventDocumentStart, EventDocumentEnd, EventStreamEnd]
45 irrelevantEvents = [EventStreamStart, EventDocumentStart, EventDocumentEnd, EventStreamEnd]
Data/Yaml/Internal.hs+11−11
@@ -27,7 +27,7 @@ import Data.Aeson.Types hiding (parse)
27import qualified Data.Attoparsec.Text as Atto
27import qualified Data.Attoparsec.Text as Atto
28import Data.ByteString (ByteString)
28import Data.ByteString (ByteString)
29import Data.Char (toUpper)
29import Data.Char (toUpper)
30−import qualified Data.Conduit as C
30+import Data.Conduit ((.|), ConduitM, runConduit)
31import qualified Data.Conduit.List as CL
31import qualified Data.Conduit.List as CL
32import qualified Data.HashMap.Strict as M
32import qualified Data.HashMap.Strict as M
33import qualified Data.HashSet as HashSet
33import qualified Data.HashSet as HashSet
@@ -125,12 +125,12 @@ instance MonadIO m => MonadIO (PErrorT m) where
125
125
126type Parse = StateT (Map.Map String Value) (ResourceT IO)
126type Parse = StateT (Map.Map String Value) (ResourceT IO)
127
127
128−requireEvent :: Event -> C.Sink Event Parse ()
128+requireEvent :: Event -> ConduitM Event o Parse ()
129requireEvent e = do
129requireEvent e = do
130 f <- CL.head
130 f <- CL.head
131 unless (f == Just e) $ liftIO $ throwIO $ UnexpectedEvent f $ Just e
131 unless (f == Just e) $ liftIO $ throwIO $ UnexpectedEvent f $ Just e
132
132
133−parse :: C.Sink Event Parse Value
133+parse :: ConduitM Event o Parse Value
134parse = do
134parse = do
135 streamStart <- CL.head
135 streamStart <- CL.head
136 case streamStart of
136 case streamStart of
@@ -152,7 +152,7 @@ parse = do
152 _ -> liftIO $ throwIO $ UnexpectedEvent streamStart Nothing
152 _ -> liftIO $ throwIO $ UnexpectedEvent streamStart Nothing
153
153
154parseScalar :: ByteString -> Anchor -> Style -> Tag
154parseScalar :: ByteString -> Anchor -> Style -> Tag
155− -> C.Sink Event Parse Text
155+ -> ConduitM Event o Parse Text
156parseScalar v a style tag = do
156parseScalar v a style tag = do
157 let res = decodeUtf8With lenientDecode v
157 let res = decodeUtf8With lenientDecode v
158 case a of
158 case a of
@@ -178,7 +178,7 @@ textToValue _ _ t
178textToScientific :: Text -> Either String Scientific
178textToScientific :: Text -> Either String Scientific
179textToScientific = Atto.parseOnly (Atto.scientific <* Atto.endOfInput)
179textToScientific = Atto.parseOnly (Atto.scientific <* Atto.endOfInput)
180
180
181−parseO :: C.Sink Event Parse Value
181+parseO :: ConduitM Event o Parse Value
182parseO = do
182parseO = do
183 me <- CL.head
183 me <- CL.head
184 case me of
184 case me of
@@ -194,7 +194,7 @@ parseO = do
194
194
195parseS :: Y.Anchor
195parseS :: Y.Anchor
196 -> ([Value] -> [Value])
196 -> ([Value] -> [Value])
197− -> C.Sink Event Parse Value
197+ -> ConduitM Event o Parse Value
198parseS a front = do
198parseS a front = do
199 me <- CL.peek
199 me <- CL.peek
200 case me of
200 case me of
@@ -212,7 +212,7 @@ parseS a front = do
212
212
213parseM :: Y.Anchor
213parseM :: Y.Anchor
214 -> M.HashMap Text Value
214 -> M.HashMap Text Value
215− -> C.Sink Event Parse Value
215+ -> ConduitM Event o Parse Value
216parseM a front = do
216parseM a front = do
217 me <- CL.peek
217 me <- CL.peek
218 case me of
218 case me of
@@ -249,13 +249,13 @@ parseM a front = do
249 merge' al _ = al
249 merge' al _ = al
250
250
251decodeHelper :: FromJSON a
251decodeHelper :: FromJSON a
252− => C.Source Parse Y.Event
252+ => ConduitM () Y.Event Parse ()
253 -> IO (Either ParseException (Either String a))
253 -> IO (Either ParseException (Either String a))
254decodeHelper src = do
254decodeHelper src = do
255 -- This used to be tryAny, but the fact is that catching async
255 -- This used to be tryAny, but the fact is that catching async
256 -- exceptions is fine here. We'll rethrow them immediately in the
256 -- exceptions is fine here. We'll rethrow them immediately in the
257 -- otherwise clause.
257 -- otherwise clause.
258− x <- try $ runResourceT $ flip evalStateT Map.empty $ src C.$$ parse
258+ x <- try $ runResourceT $ flip evalStateT Map.empty $ runConduit $ src .| parse
259 case x of
259 case x of
260 Left e
260 Left e
261 | Just pe <- fromException e -> return $ Left pe
261 | Just pe <- fromException e -> return $ Left pe
@@ -264,10 +264,10 @@ decodeHelper src = do
264 Right y -> return $ Right $ parseEither parseJSON y
264 Right y -> return $ Right $ parseEither parseJSON y
265
265
266decodeHelper_ :: FromJSON a
266decodeHelper_ :: FromJSON a
267− => C.Source Parse Event
267+ => ConduitM () Event Parse ()
268 -> IO (Either ParseException a)
268 -> IO (Either ParseException a)
269decodeHelper_ src = do
269decodeHelper_ src = do
270− x <- try $ runResourceT $ flip evalStateT Map.empty $ src C.$$ parse
270+ x <- try $ runResourceT $ flip evalStateT Map.empty $ runConduit $ src .| parse
271 return $ case x of
271 return $ case x of
272 Left e
272 Left e
273 | Just pe <- fromException e -> Left pe
273 | Just pe <- fromException e -> Left pe
Data/Yaml/Parser.hs+4−4
@@ -9,7 +9,7 @@ import Control.Applicative
9import Control.Exception (Exception)
9import Control.Exception (Exception)
10import Control.Monad (MonadPlus (..), liftM, ap)
10import Control.Monad (MonadPlus (..), liftM, ap)
11import Control.Monad.Trans.Class (lift)
11import Control.Monad.Trans.Class (lift)
12−import Control.Monad.Trans.Resource (MonadThrow, throwM, runResourceT)
12+import Control.Monad.Trans.Resource (MonadThrow, throwM)
13import Control.Monad.Trans.Writer.Strict (tell, WriterT)
13import Control.Monad.Trans.Writer.Strict (tell, WriterT)
14import Data.ByteString (ByteString)
14import Data.ByteString (ByteString)
15import Data.Conduit
15import Data.Conduit
@@ -147,7 +147,7 @@ data YamlParseException
147 deriving (Show, Typeable)
147 deriving (Show, Typeable)
148instance Exception YamlParseException
148instance Exception YamlParseException
149
149
150−sinkValue :: MonadThrow m => Consumer Event (WriterT AnchorMap m) YamlValue
150+sinkValue :: MonadThrow m => ConduitM Event o (WriterT AnchorMap m) YamlValue
151sinkValue =
151sinkValue =
152 start
152 start
153 where
153 where
@@ -194,8 +194,8 @@ sinkValue =
194 goM (front . ((k, v):))
194 goM (front . ((k, v):))
195 Just e -> throwM $ UnexpectedEvent e
195 Just e -> throwM $ UnexpectedEvent e
196
196
197−sinkRawDoc :: MonadThrow m => Consumer Event m RawDoc
197+sinkRawDoc :: MonadThrow m => ConduitM Event o m RawDoc
198sinkRawDoc = uncurry RawDoc <$> runWriterC sinkValue
198sinkRawDoc = uncurry RawDoc <$> runWriterC sinkValue
199
199
200readYamlFile :: FromYaml a => FilePath -> IO a
200readYamlFile :: FromYaml a => FilePath -> IO a
201−readYamlFile fp = runResourceT (decodeFile fp $$ sinkRawDoc) >>= parseRawDoc
201+readYamlFile fp = runConduitRes (decodeFile fp .| sinkRawDoc) >>= parseRawDoc
Text/Libyaml.hs+6−6
@@ -479,7 +479,7 @@ newtype ToEventRawException = ToEventRawException CInt
479 deriving (Show, Typeable)
479 deriving (Show, Typeable)
480instance Exception ToEventRawException
480instance Exception ToEventRawException
481
481
482−decode :: MonadResource m => B.ByteString -> Producer m Event
482+decode :: MonadResource m => B.ByteString -> ConduitM i Event m ()
483decode bs | B8.null bs = return ()
483decode bs | B8.null bs = return ()
484decode bs =
484decode bs =
485 bracketP alloc cleanup (runParser . fst)
485 bracketP alloc cleanup (runParser . fst)
@@ -521,7 +521,7 @@ openFile file rawOpenFlags openMode = do
521 then withCString openMode $ \openMode' -> c_fdopen fd openMode'
521 then withCString openMode $ \openMode' -> c_fdopen fd openMode'
522 else return nullPtr
522 else return nullPtr
523
523
524−decodeFile :: MonadResource m => FilePath -> Producer m Event
524+decodeFile :: MonadResource m => FilePath -> ConduitM i Event m ()
525decodeFile file =
525decodeFile file =
526 bracketP alloc cleanup (runParser . fst)
526 bracketP alloc cleanup (runParser . fst)
527 where
527 where
@@ -549,7 +549,7 @@ decodeFile file =
549 c_yaml_parser_delete ptr
549 c_yaml_parser_delete ptr
550 free ptr
550 free ptr
551
551
552−runParser :: MonadResource m => Parser -> Producer m Event
552+runParser :: MonadResource m => Parser -> ConduitM i Event m ()
553runParser parser = do
553runParser parser = do
554 e <- liftIO $ parserParseOne' parser
554 e <- liftIO $ parserParseOne' parser
555 case e of
555 case e of
@@ -573,7 +573,7 @@ parserParseOne' parser = allocaBytes eventSize $ \er -> do
573 return $ Left $ YamlParseException problem context problemMark
573 return $ Left $ YamlParseException problem context problemMark
574 else Right <$> getEvent er
574 else Right <$> getEvent er
575
575
576−encode :: MonadResource m => Consumer Event m ByteString
576+encode :: MonadResource m => ConduitM Event o m ByteString
577encode =
577encode =
578 runEmitter alloc close
578 runEmitter alloc close
579 where
579 where
@@ -590,7 +590,7 @@ encode =
590
590
591encodeFile :: MonadResource m
591encodeFile :: MonadResource m
592 => FilePath
592 => FilePath
593− -> Consumer Event m ()
593+ -> ConduitM Event o m ()
594encodeFile filePath =
594encodeFile filePath =
595 bracketP getFile c_fclose $ \file -> runEmitter (alloc file) (\u _ -> return u)
595 bracketP getFile c_fclose $ \file -> runEmitter (alloc file) (\u _ -> return u)
596 where
596 where
@@ -605,7 +605,7 @@ encodeFile filePath =
605runEmitter :: MonadResource m
605runEmitter :: MonadResource m
606 => (Emitter -> IO a) -- ^ alloc
606 => (Emitter -> IO a) -- ^ alloc
607 -> (() -> a -> IO b) -- ^ close
607 -> (() -> a -> IO b) -- ^ close
608− -> Consumer Event m b
608+ -> ConduitM Event o m b
609runEmitter allocI closeI =
609runEmitter allocI closeI =
610 bracketP alloc cleanup go
610 bracketP alloc cleanup go
611 where
611 where
test/Data/YamlSpec.hs+14−15
@@ -11,8 +11,7 @@ import qualified Data.ByteString.Char8 as B8
11
11
12import Test.HUnit hiding (Test, path)
12import Test.HUnit hiding (Test, path)
13
13
14−import qualified Data.Conduit as C
14+import Data.Conduit (runConduitRes, (.|), ConduitM)
15−import qualified Control.Monad.Trans.Resource as C
16import qualified Data.Conduit.List as CL
15import qualified Data.Conduit.List as CL
17
16
18import Control.Monad
17import Control.Monad
@@ -172,7 +171,7 @@ specialStrings =
172 , "foo\nbar\nbaz\n"
171 , "foo\nbar\nbaz\n"
173 ]
172 ]
174
173
175−counter :: Monad m => (Y.Event -> Bool) -> C.Sink Y.Event m Int
174+counter :: Monad m => (Y.Event -> Bool) -> ConduitM Y.Event o m Int
176counter pred' =
175counter pred' =
177 CL.fold (\cnt e -> (if pred' e then 1 else 0) + cnt) 0
176 CL.fold (\cnt e -> (if pred' e then 1 else 0) + cnt) 0
178
177
@@ -181,7 +180,7 @@ caseHelper :: String
181 -> Int
180 -> Int
182 -> Assertion
181 -> Assertion
183caseHelper yamlString pred' expRes = do
182caseHelper yamlString pred' expRes = do
184− res <- C.runResourceT $ Y.decode (B8.pack yamlString) C.$$ counter pred'
183+ res <- runConduitRes $ Y.decode (B8.pack yamlString) .| counter pred'
185 res @?= expRes
184 res @?= expRes
186
185
187caseCountScalarsWithAnchor :: Assertion
186caseCountScalarsWithAnchor :: Assertion
@@ -218,7 +217,7 @@ caseCountAliases =
218
217
219caseCountScalars :: Assertion
218caseCountScalars :: Assertion
220caseCountScalars = do
219caseCountScalars = do
221− res <- C.runResourceT $ Y.decode yamlBS C.$$ CL.fold adder accum
220+ res <- runConduitRes $ Y.decode yamlBS .| CL.fold adder accum
222 res @?= (7, 1, 2)
221 res @?= (7, 1, 2)
223 where
222 where
224 yamlString = "foo:\n baz: [bin1, bin2, bin3]\nbaz: bazval"
223 yamlString = "foo:\n baz: [bin1, bin2, bin3]\nbaz: bazval"
@@ -231,7 +230,7 @@ caseCountScalars = do
231
230
232caseLargestString :: Assertion
231caseLargestString :: Assertion
233caseLargestString = do
232caseLargestString = do
234− res <- C.runResourceT $ Y.decodeFile filePath C.$$ CL.fold adder accum
233+ res <- runConduitRes $ Y.decodeFile filePath .| CL.fold adder accum
235 res @?= (length expected, expected)
234 res @?= (length expected, expected)
236 where
235 where
237 expected = "this one is just a little bit bigger than the others"
236 expected = "this one is just a little bit bigger than the others"
@@ -251,9 +250,9 @@ instance Eq MyEvent where
251
250
252caseEncodeDecode :: Assertion
251caseEncodeDecode :: Assertion
253caseEncodeDecode = do
252caseEncodeDecode = do
254− eList <- C.runResourceT $ Y.decode yamlBS C.$$ CL.consume
253+ eList <- runConduitRes $ Y.decode yamlBS .| CL.consume
255− bs <- C.runResourceT $ CL.sourceList eList C.$$ Y.encode
254+ bs <- runConduitRes $ CL.sourceList eList .| Y.encode
256− eList2 <- C.runResourceT $ Y.decode bs C.$$ CL.consume
255+ eList2 <- runConduitRes $ Y.decode bs .| CL.consume
257 map MyEvent eList @=? map MyEvent eList2
256 map MyEvent eList @=? map MyEvent eList2
258 where
257 where
259 yamlString = "foo: bar\nbaz:\n - bin1\n - bin2\n"
258 yamlString = "foo: bar\nbaz:\n - bin1\n - bin2\n"
@@ -261,17 +260,17 @@ caseEncodeDecode = do
261
260
262caseEncodeDecodeFile :: Assertion
261caseEncodeDecodeFile :: Assertion
263caseEncodeDecodeFile = withFile "" $ \tmpPath -> do
262caseEncodeDecodeFile = withFile "" $ \tmpPath -> do
264− eList <- C.runResourceT $ Y.decodeFile filePath C.$$ CL.consume
263+ eList <- runConduitRes $ Y.decodeFile filePath .| CL.consume
265− C.runResourceT $ CL.sourceList eList C.$$ Y.encodeFile tmpPath
264+ runConduitRes $ CL.sourceList eList .| Y.encodeFile tmpPath
266− eList2 <- C.runResourceT $ Y.decodeFile filePath C.$$ CL.consume
265+ eList2 <- runConduitRes $ Y.decodeFile filePath .| CL.consume
267 map MyEvent eList @=? map MyEvent eList2
266 map MyEvent eList @=? map MyEvent eList2
268 where
267 where
269 filePath = "test/largest-string.yaml"
268 filePath = "test/largest-string.yaml"
270
269
271caseInterleave :: Assertion
270caseInterleave :: Assertion
272caseInterleave = withFile "" $ \tmpPath -> withFile "" $ \tmpPath2 -> do
271caseInterleave = withFile "" $ \tmpPath -> withFile "" $ \tmpPath2 -> do
273− () <- C.runResourceT $ Y.decodeFile filePath C.$$ Y.encodeFile tmpPath
272+ () <- runConduitRes $ Y.decodeFile filePath .| Y.encodeFile tmpPath
274− () <- C.runResourceT $ Y.decodeFile tmpPath C.$$ Y.encodeFile tmpPath2
273+ () <- runConduitRes $ Y.decodeFile tmpPath .| Y.encodeFile tmpPath2
275 f1 <- readFile tmpPath
274 f1 <- readFile tmpPath
276 f2 <- readFile tmpPath2
275 f2 <- readFile tmpPath2
277 f1 @=? f2
276 f1 @=? f2
@@ -280,7 +279,7 @@ caseInterleave = withFile "" $ \tmpPath -> withFile "" $ \tmpPath2 -> do
280
279
281caseDecodeInvalidDocument :: Assertion
280caseDecodeInvalidDocument :: Assertion
282caseDecodeInvalidDocument = do
281caseDecodeInvalidDocument = do
283− x <- try $ C.runResourceT $ Y.decode yamlBS C.$$ CL.sinkNull
282+ x <- try $ runConduitRes $ Y.decode yamlBS .| CL.sinkNull
284 case x of
283 case x of
285 Left (_ :: SomeException) -> return ()
284 Left (_ :: SomeException) -> return ()
286 Right y -> do
285 Right y -> do
yaml.cabal+1−1
@@ -48,7 +48,7 @@ library
48 build-depends: base >= 4 && < 5
48 build-depends: base >= 4 && < 5
49 , transformers >= 0.1
49 , transformers >= 0.1
50 , bytestring >= 0.9.1.4
50 , bytestring >= 0.9.1.4
51− , conduit >= 1.1.0 && < 1.4
51+ , conduit >= 1.2.8 && < 1.4
52 , resourcet >= 0.3 && < 1.3
52 , resourcet >= 0.3 && < 1.3
53 , aeson >= 0.7
53 , aeson >= 0.7
54 , containers
54 , containers