packages feed

epoll-0.1: examples/StdinM.hs

module Main where

import Text.Printf
import Control.Monad.Reader
import System.IO
import System.Posix.IO
import System.Linux.EpollM

eventTypes :: [EventType]
eventTypes = [inEvent, edgeTriggeredEvent, oneShotEvent]

callback :: Event a -> Epoll ()
callback e = do
    let fd = eventFd e
        et = eventType e
        ds = eventDesc e
    liftIO $ do
        setFdOption fd NonBlockingRead True
        printf "event=%s, fd=%s\n" (show et) (show fd)
        (s, c) <- fdRead fd 16
        printf "read %s byte(s): %s\n" (show c) s
    modify eventTypes ds

main :: IO ()
main = runEpollSmall_ $ do
    add_ eventTypes stdInput
    defaultDispatchLoop callback