]> code.delx.au - offlineimap/commitdiff
Refine the State-based connection
authorJohn Goerzen <jgoerzen@complete.org>
Mon, 11 Aug 2008 10:56:16 +0000 (05:56 -0500)
committerJohn Goerzen <jgoerzen@complete.org>
Mon, 11 Aug 2008 10:56:16 +0000 (05:56 -0500)
src/Network/IMAP/Connection.hs

index 2172c50ca519a091ee5dec53e380bffe0d9def8b..bd1b4547dad4d799e32400460f60092c5b3dfcb3 100644 (file)
@@ -22,14 +22,15 @@ import Control.Monad.State
 import Data.List.Utils(spanList)
 import Data.List(genericSplitAt, genericLength)
 
--- | Take an IMAPString and treat it as messages from the server.
--- | Remember that EOL in IMAP protocols is \r\n!
-
-stringConnection :: 
-    IMAPString ->               -- ^ The initial content of the buffer for the client to read from
-    IMAPString ->               -- ^ The initial content of the buffer for the client to write to
-    IMAPConnection (State (IMAPString, IMAPString))
-stringConnection sdata wdata =
+{- | Set up an IMAPConnection that runs in the State monad.
+
+The state is (bufferToClient, bufferFromClient)
+
+Remember that EOL in IMAP protocols is \r\n!
+
+closeConnection is ignored with this monad. -}
+newStringConnection :: IMAPConnection (State (IMAPString, IMAPString))
+newStringConnection =
     IMAPConnection {readBytes = lreadBytes,
                     readLine = lreadLine,
                     writeBytes = lwriteBytes,
@@ -54,3 +55,17 @@ stringConnection sdata wdata =
               do (s, sw) <- get
                  put (s, sw ++ outdata)
 
+{- | Runs a State monad with a String connection.  Returns
+(retval, remainingBufferToClient, bufferFromClient) -}
+{-
+runStringConnection :: 
+    IMAPString -> 
+    ((State s a) -> a) ->
+    (a, IMAPString, IMAPString)
+-}
+runStringConnection ::
+       IMAPString               -- ^ Buffer to send to clients
+    -> (IMAPConnection (State (IMAPString, IMAPString)) -> State (IMAPString, IMAPString) a) -- ^ Function to run
+    -> (a, (String, String))    -- ^ Results: func result, buffer status
+runStringConnection sbuf func =
+    runState (func newStringConnection) (sbuf::String, []::String)