module Eventloop.Types.EventTypes where
import System.IO
import Data.Maybe
import Control.Concurrent
import qualified Eventloop.Utility.Websockets as WS
import qualified Eventloop.Utility.BufferedWebsockets as BWS
import Eventloop.Module.Websocket.Keyboard.Types
import Eventloop.Module.Websocket.Mouse.Types
import Eventloop.Module.Websocket.Canvas.Types
import Eventloop.Module.DrawTrees.Types
import Eventloop.Module.BasicShapes.Types
import Eventloop.Module.File.Types
import Eventloop.Module.StdIn.Types
import Eventloop.Module.StdOut.Types
import Eventloop.Module.Timer.Types
type EventloopModuleIdentifier = [Char]
type Initializer = SharedIOState -> IOState -> IO (SharedIOState, IOState)
type EventRetriever = SharedIOState -> IOState -> IO (SharedIOState, IOState, [In])
type PreProcessor = SharedIOState -> IOState -> In -> IO (SharedIOState, IOState, [In])
type PostProcessor = SharedIOState -> IOState -> Out -> IO (SharedIOState, IOState, [Out])
type EventSender = SharedIOState -> IOState -> Out -> IO (SharedIOState, IOState)
type Teardown = SharedIOState -> IOState -> IO (SharedIOState, IOState)
type OutEventRouter = Out -> EventloopModuleIdentifier
data EventloopModuleConfiguration = EventloopModuleConfiguration { moduleIdentifier :: EventloopModuleIdentifier
, iostate :: IOState
, initializer :: Maybe Initializer
, eventRetriever :: Maybe EventRetriever
, preprocessor :: Maybe PreProcessor
, postprocessor :: Maybe PostProcessor
, teardown :: Maybe Teardown
, eventSender :: Maybe EventSender
}
data EventloopConfiguration progstateT = EventloopConfiguration { progState :: progstateT
, eventloopFunc :: progstateT -> In -> (progstateT, [Out])
, outRouter :: OutEventRouter
, sharedIOState :: SharedIOState
, moduleConfigurations :: [EventloopModuleConfiguration]
}
data In = Start
| InKeyboard Keyboard
| InMouse Mouse
| InFile FileIn
| InTimer TimerIn
| InStdIn StdInIn
| InCanvas CanvasIn
deriving (Eq, Show)
data Out = OutFile FileOut
| OutTimer TimerOut
| OutStdOut StdOutOut
| OutStdIn StdInOut
| OutCanvas CanvasOut
| OutBasicShapes BasicShapesOut
| OutDrawTrees DrawTreesOut
| Stop
deriving (Eq, Show)
data SharedIOState = SharedIOState { measureText :: CanvasText -> IO ScreenDimensions
}
data IOState = MouseState { receiveBuffer :: BWS.BufferedReceiveBuffer
, clientConnection :: BWS.Connection
, serverSocket :: BWS.Socket
}
| KeyboardState { receiveBuffer :: BWS.BufferedReceiveBuffer
, clientConnection :: BWS.Connection
, serverSocket :: BWS.Socket
}
| CanvasState { commonReceiveBuffer :: WS.ReceiveBuffer
, canvasUserReceiveBuffer :: CanvasUserReceiveBuffer
, canvasSystemReceiveBuffer :: CanvasSystemReceiveBuffer
, clientConnection :: WS.Connection
, serverSocket :: WS.Socket
, routerThreadId :: ThreadId
}
| StdInState { newStdInInEvents :: [StdInIn]
}
| TimerState { startedIntervalTimers :: [StartedTimer]
, startedTimers :: [StartedTimer]
, incomingIntervalTickBuffer :: IncomingTickBuffer
, incomingTickBuffer :: IncomingTickBuffer
}
| FileState { newFileInEvents :: [FileIn]
, opened :: [OpenFile]
}
| NoState
type APIName = [Char]
type Parameter = [Char]
type Value = [Char]
type Parameters =[(Parameter, Value)]