@@ -74,6 +74,7 @@ instance MonadBaseControl IO m => Monoid (Source m a) where
75 liftBase $ I.writeIORef istate Nothing
75 liftBase $ I.writeIORef istate Nothing
76 return EOF
76 return EOF
77+ Chunks _ -> return stream
78type SinkInsideData a m b = Stream a -> ResourceT m (SinkResult a b)
79type SinkInsideData a m b = Stream a -> ResourceT m (SinkResult a b)
79data SinkInside a m b =
80data SinkInside a m b =
@@ -143,32 +144,31 @@ sinkJoin (Sink msinkI) = Sink $ do
143 sinkI <- msinkI
144 sinkI <- msinkI
144 case sinkI of
145 case sinkI of
145 SinkNoData (Sink inner) -> inner
146 SinkNoData (Sink inner) -> inner
146− SinkData _msink -> do
147+ SinkData msink -> do
149 istate <- liftBase $ I.newIORef Nothing
148 istate <- liftBase $ I.newIORef Nothing
150− return $ go istate msink
149+ return $ SinkData $ go istate msink
152 go :: MonadBaseControl IO m
151 go :: MonadBaseControl IO m
153− => I.IORef (Maybe (SinkInside a m b))
152+ => I.IORef (Maybe (SinkInsideData a m b))
154 -> (Stream a -> ResourceT m (SinkResult a (Sink a m b)))
153 -> (Stream a -> ResourceT m (SinkResult a (Sink a m b)))
155− -> Stream a
154+ -> SinkInsideData a m b
156− -> ResourceT m (SinkResult a b)
157 go istate outer stream = do
155 go istate outer stream = do
158 state <- liftBase $ I.readIORef istate
156 state <- liftBase $ I.readIORef istate
159 case state of
157 case state of
160 Nothing -> do
158 Nothing -> do
161 SinkResult leftover minner' <- outer stream
159 SinkResult leftover minner' <- outer stream
162 case minner' of
160 case minner' of
163− Just (SinkData minner) -> do
161+ Just (Sink msink) -> do
164− inner <- minner
162+ sink <- msink
164+ SinkData inner -> do
165− liftBase $ I.writeIORef istate $ Just inner
165+ liftBase $ I.writeIORef istate $ Just inner
166− if null leftover
166+ if null leftover
167− then return $ SinkResult [] Nothing
167+ then return $ SinkResult [] Nothing
168− else go istate outer $ Chunks leftover
168+ else go istate outer $ Chunks leftover
169+ SinkNoData x -> return $ SinkResult leftover $ Just x
169 Nothing -> return $ SinkResult leftover Nothing
170 Nothing -> return $ SinkResult leftover Nothing
170 Just inner -> inner stream
171 Just inner -> inner stream
173type Conduit a m b = Stream a -> ResourceT m (ConduitResult a b)
173type Conduit a m b = Stream a -> ResourceT m (ConduitResult a b)