Advertisement
Yurry

Infinitely lazy server #Haskell #TCP #SpecialOlympics

Jan 15th, 2014
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import Control.Applicative
  2. import Control.Concurrent
  3. import Data.Attoparsec.Char8 hiding (parse, maybeResult)
  4. import Data.Attoparsec.Lazy (skip, parse, maybeResult)
  5. import qualified Data.ByteString.Lazy.Char8 as BS
  6. import Data.Maybe (fromMaybe)
  7. import Network
  8. import Network.Socket hiding (accept)
  9. import System.IO
  10.  
  11. import Data.Char
  12.  
  13. chainl1 elem op = elem >>= rest where
  14.     rest s1 = do {f <- op; s2 <- chainl1 elem op; return $ f s1 s2} <|> return s1
  15.  
  16. expr :: Parser Int    
  17. expr = chainl1 term $ (char '+' >> return (+)) <|> (char '-' >> return (-))
  18.  
  19. term = chainl1 factor $ char '*' >> return (*)
  20.  
  21. factor = (char '(' *> expr <* char ')') <|> decimal
  22.    
  23. calc str = case maybeResult $ parse (expr <* (skip isEndOfLine >> endOfInput)) str of
  24.     Nothing -> BS.pack "error"
  25.     Just res -> BS.pack $ show res
  26.  
  27. process handle = do
  28.     all <- BS.hGetContents handle
  29.     mapM_ (BS.hPutStrLn handle . calc) $ BS.split '\n' all
  30.  
  31. handler sock = do
  32.     (handle, host, port) <- accept sock
  33.     hSetBuffering handle LineBuffering
  34.     forkIO $ process handle
  35.     handler sock
  36.  
  37. main = do
  38.     sock <- listenOn (PortNumber 65535)
  39.     setSocketOption sock NoDelay 1
  40.     handler sock
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement