-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | A different take on an IO system. Based on Amanda's IO loop, this eventloop takes a function that maps input events to output events. It can easily be extended by modules that represent IO devices or join multiple modules together. -- -- A different take on an IO system. Based on Amanda's IO loop, this -- eventloop takes a function that maps input events to output events. It -- can easily be extended by modules that represent IO devices or join -- multiple modules together. Each module exists of a initialize and -- teardown function that are both called once at startup and shutting -- down. During run-time, a module can provice a preprocessor function -- (which transforms input events before they get to the eventloop), and -- a postprocessor function (which transforms output events after they -- are received from the eventloop but before they are send off). Next to -- these bookkeeping functions, a module can exist of a (check for events -- and an event retrieve) function pair which result in input events and -- an addition to the event sender function which handles output events. -- This results in the following states: |Start|: initialize -> -- |Run-Time| -> teardown |Run-Time|: eventCheckers - Yes > -- preprocessors -> eventloop -> postprocessors -> event sender -- -> |Run-Time| |- No > |Run-Time| Each module has a piece of -- "memory"state which is defined by the module itself and all of the -- module states are combined in the IO state. When writinginstalling -- a module, modifications has to be made at certain points in the code -- due to the poor modularity of Haskell. @package eventloop @version 0.8.2.5 module Eventloop.Utility.Vectors type Angle = Float In degrees type Radians = Float type Length = Float type X = Float type Y = Float type Offset = (X, Y) data PolarCoord PolarCoord :: (Length, Radians) -> PolarCoord data Point Point :: (X, Y) -> Point class Coord a x :: Coord a => a -> X y :: Coord a => a -> Y class ExtremaCoord a xMin :: ExtremaCoord a => a -> X xMax :: ExtremaCoord a => a -> X yMin :: ExtremaCoord a => a -> Y yMax :: ExtremaCoord a => a -> Y degreesToRadians :: Angle -> Radians radiansToDegrees :: Radians -> Angle lengthToPoint :: Point -> Length lengthBetweenPoints :: Point -> Point -> Length differenceBetweenPoints :: Point -> Point -> (X, Y) averagePoint :: [Point] -> Point -- | Returns the vector perpendicular on the given vector between the 2 -- points. Always has positive y and vector length 1; y is inverted in -- canvas downPerpendicular :: Point -> Point -> Point -- | Returns the vector perpendicular on the given vector between the 2 -- points. Always has negative y and vector length 1; y is inverted in -- canvas upPerpendicular :: Point -> Point -> Point followVector :: Float -> Point -> Point -> Point intersectVector :: Point -> Point -> Point -> Point -> Maybe Point turnToVector :: Point -> Radians -> Point -> Point originPoint :: Point class Translate a translate :: Translate a => Point -> a -> a class (Coord a) => Vector2D a (|+|) :: Vector2D a => a -> a -> a (|-|) :: Vector2D a => a -> a -> a (|/) :: (Vector2D a, Real b) => a -> b -> a (|*) :: (Vector2D a, Real b) => a -> b -> a negateVector :: Vector2D a => a -> a angleBetween :: Vector2D a => a -> a -> Radians class ToPoint a toPoint :: ToPoint a => a -> Point class ToPolarCoord a toPolarCoord :: ToPolarCoord a => a -> PolarCoord class RotateLeftAround a rotateLeftAround :: RotateLeftAround a => Point -> Angle -> a -> a instance Control.DeepSeq.NFData Eventloop.Utility.Vectors.Point instance GHC.Generics.Generic Eventloop.Utility.Vectors.Point instance GHC.Classes.Eq Eventloop.Utility.Vectors.Point instance GHC.Show.Show Eventloop.Utility.Vectors.Point instance GHC.Classes.Eq Eventloop.Utility.Vectors.PolarCoord instance GHC.Show.Show Eventloop.Utility.Vectors.PolarCoord instance Eventloop.Utility.Vectors.Coord Eventloop.Utility.Vectors.Point instance Eventloop.Utility.Vectors.Coord Eventloop.Utility.Vectors.PolarCoord instance Eventloop.Utility.Vectors.ExtremaCoord [Eventloop.Utility.Vectors.Point] instance Eventloop.Utility.Vectors.Vector2D Eventloop.Utility.Vectors.PolarCoord instance Eventloop.Utility.Vectors.Vector2D Eventloop.Utility.Vectors.Point instance Eventloop.Utility.Vectors.ToPoint Eventloop.Utility.Vectors.PolarCoord instance Eventloop.Utility.Vectors.ToPolarCoord Eventloop.Utility.Vectors.Point instance Eventloop.Utility.Vectors.RotateLeftAround Eventloop.Utility.Vectors.PolarCoord instance Eventloop.Utility.Vectors.RotateLeftAround Eventloop.Utility.Vectors.Point module Eventloop.Types.Common type EventloopModuleIdentifier = [Char] type ProcessingDescription = [Char] type NamedId = [Char] type NumericId = Int module Eventloop.Utility.Trees.GeneralTree data GeneralTree GeneralTreeBox :: [GeneralNodeContent] -> [(GeneralLine, GeneralTree)] -> GeneralTree data GeneralNodeContent GeneralNodeText :: FillColor -> String -> GeneralNodeContent GeneralNode :: FillColor -> Radius -> GeneralNodeContent data GeneralLine GeneralLine :: StrokeColor -> GeneralLine type LeftOffset = X type TopOffset = Y type RightOffset = X type BottomOffset = Y type Middle = GraphicalNumeric type Pos = (X, Y) class GeneralizeTree a generalizeTree :: GeneralizeTree a => a -> GeneralTree textFont :: [Char] textHeight :: Float charWidth :: Float marginBetweenTrees :: Float marginBetweenNodeContent :: Float marginBetweenNodeRows :: Float marginBetweenNodeColumns :: Float generalNodeDimension :: GeneralTree -> Dimensions flattenDimensions :: [Dimensions] -> Dimensions generalNodeContentDimension :: GeneralNodeContent -> Dimensions layoutGeneralTree :: LeftOffset -> TopOffset -> GeneralTree -> (LayoutTree, RightOffset, BottomOffset) layoutGeneralTreeChildren :: LeftOffset -> TopOffset -> [(GeneralLine, GeneralTree)] -> ([(LayoutLine, LayoutTree)], RightOffset, BottomOffset) layoutLine :: GeneralLine -> LayoutLine layoutGeneralTrees :: LeftOffset -> TopOffset -> [GeneralTree] -> ([LayoutTree], RightOffset, BottomOffset) layoutGeneralNodeContentList :: Middle -> Height -> [GeneralNodeContent] -> [LayoutNodeContent] layoutGeneralNodeContent :: Pos -> GeneralNodeContent -> LayoutNodeContent textSize :: [Char] -> (Float, Float) treeIndex :: Int -> Offset -> (Shape, LeftOffset) instance Control.DeepSeq.NFData Eventloop.Utility.Trees.GeneralTree.GeneralTree instance GHC.Generics.Generic Eventloop.Utility.Trees.GeneralTree.GeneralTree instance GHC.Classes.Eq Eventloop.Utility.Trees.GeneralTree.GeneralTree instance GHC.Show.Show Eventloop.Utility.Trees.GeneralTree.GeneralTree instance Control.DeepSeq.NFData Eventloop.Utility.Trees.GeneralTree.GeneralLine instance GHC.Generics.Generic Eventloop.Utility.Trees.GeneralTree.GeneralLine instance GHC.Classes.Eq Eventloop.Utility.Trees.GeneralTree.GeneralLine instance GHC.Show.Show Eventloop.Utility.Trees.GeneralTree.GeneralLine instance Control.DeepSeq.NFData Eventloop.Utility.Trees.GeneralTree.GeneralNodeContent instance GHC.Generics.Generic Eventloop.Utility.Trees.GeneralTree.GeneralNodeContent instance GHC.Classes.Eq Eventloop.Utility.Trees.GeneralTree.GeneralNodeContent instance GHC.Show.Show Eventloop.Utility.Trees.GeneralTree.GeneralNodeContent instance Eventloop.Utility.Trees.GeneralTree.GeneralizeTree Eventloop.Utility.Trees.GeneralTree.GeneralTree module Eventloop.Types.Events data In Start :: In InKeyboard :: Keyboard -> In InMouse :: MouseIn -> In InFile :: FileIn -> In InTimer :: TimerIn -> In InStdIn :: StdInIn -> In InCanvas :: CanvasIn -> In InGraphs :: GraphsIn -> In data Out OutFile :: FileOut -> Out OutTimer :: TimerOut -> Out OutStdOut :: StdOutOut -> Out OutStdIn :: StdInOut -> Out OutCanvas :: CanvasOut -> Out OutBasicShapes :: BasicShapesOut -> Out OutDrawTrees :: DrawTreesOut -> Out OutGraphs :: GraphsOut -> Out OutStatefulGraphics :: CanvasId -> [StatefulGraphicsOut] -> Out Stop :: Out instance Control.DeepSeq.NFData Eventloop.Types.Events.Out instance GHC.Generics.Generic Eventloop.Types.Events.Out instance GHC.Show.Show Eventloop.Types.Events.Out instance GHC.Classes.Eq Eventloop.Types.Events.Out instance GHC.Show.Show Eventloop.Types.Events.In instance GHC.Classes.Eq Eventloop.Types.Events.In module Eventloop.Types.System type Initializer = SharedIOConstants -> SharedIOState -> IO (SharedIOConstants, SharedIOState, IOConstants, IOState) type EventRetriever = SharedIOConstants -> TVar SharedIOState -> IOConstants -> TVar IOState -> IO [In] type PreProcessor = SharedIOConstants -> TVar SharedIOState -> IOConstants -> TVar IOState -> In -> IO [In] type PostProcessor = SharedIOConstants -> TVar SharedIOState -> IOConstants -> TVar IOState -> Out -> IO [Out] type EventSender = SharedIOConstants -> TVar SharedIOState -> IOConstants -> TVar IOState -> Out -> IO () type Teardown = SharedIOConstants -> SharedIOState -> IOConstants -> IOState -> IO SharedIOState type OutEventRouter = Out -> EventloopModuleIdentifier type InEventQueue = BlockingConcurrentQueue In type OutEventQueue = BlockingConcurrentQueue Out type SenderEventQueue = BlockingConcurrentQueue Out data EventloopModuleConfiguration EventloopModuleConfiguration :: EventloopModuleIdentifier -> IOConstants -> TVar IOState -> Maybe Initializer -> Maybe EventRetriever -> Maybe PreProcessor -> Maybe PostProcessor -> Maybe EventloopModuleSenderConfiguration -> Maybe Teardown -> EventloopModuleConfiguration [moduleId] :: EventloopModuleConfiguration -> EventloopModuleIdentifier [ioConstants] :: EventloopModuleConfiguration -> IOConstants [ioStateT] :: EventloopModuleConfiguration -> TVar IOState [initializerM] :: EventloopModuleConfiguration -> Maybe Initializer [retrieverM] :: EventloopModuleConfiguration -> Maybe EventRetriever [preprocessorM] :: EventloopModuleConfiguration -> Maybe PreProcessor [postprocessorM] :: EventloopModuleConfiguration -> Maybe PostProcessor [senderConfigM] :: EventloopModuleConfiguration -> Maybe EventloopModuleSenderConfiguration [teardownM] :: EventloopModuleConfiguration -> Maybe Teardown data EventloopModuleSenderConfiguration EventloopModuleSenderConfiguration :: EventSender -> BlockingConcurrentQueue Out -> EventloopModuleSenderConfiguration [sender] :: EventloopModuleSenderConfiguration -> EventSender [senderEventQueue] :: EventloopModuleSenderConfiguration -> BlockingConcurrentQueue Out data EventloopConfiguration progstateT EventloopConfiguration :: TVar progstateT -> (progstateT -> In -> (progstateT, [Out])) -> InEventQueue -> OutEventQueue -> EventloopConfiguration progstateT [progstateT] :: EventloopConfiguration progstateT -> TVar progstateT [eventloopFunc] :: EventloopConfiguration progstateT -> progstateT -> In -> (progstateT, [Out]) [inEventQueue] :: EventloopConfiguration progstateT -> InEventQueue [outEventQueue] :: EventloopConfiguration progstateT -> OutEventQueue data EventloopSystemConfiguration progstateT EventloopSystemConfiguration :: EventloopConfiguration progstateT -> [EventloopModuleConfiguration] -> SharedIOConstants -> TVar SharedIOState -> ThreadId -> MVar [Thread] -> MVar Thread -> MVar [Thread] -> ExceptionCollection SomeException -> MVar Bool -> EventloopSystemConfiguration progstateT [eventloopConfig] :: EventloopSystemConfiguration progstateT -> EventloopConfiguration progstateT [moduleConfigs] :: EventloopSystemConfiguration progstateT -> [EventloopModuleConfiguration] [sharedIOConstants] :: EventloopSystemConfiguration progstateT -> SharedIOConstants [sharedIOStateT] :: EventloopSystemConfiguration progstateT -> TVar SharedIOState [systemThreadId] :: EventloopSystemConfiguration progstateT -> ThreadId [retrieverThreadsM] :: EventloopSystemConfiguration progstateT -> MVar [Thread] [outRouterThreadM] :: EventloopSystemConfiguration progstateT -> MVar Thread [senderThreadsM] :: EventloopSystemConfiguration progstateT -> MVar [Thread] [exceptions] :: EventloopSystemConfiguration progstateT -> ExceptionCollection SomeException [isStoppingM] :: EventloopSystemConfiguration progstateT -> MVar Bool data EventloopSetupConfiguration progstateT EventloopSetupConfiguration :: progstateT -> (progstateT -> In -> (progstateT, [Out])) -> [EventloopSetupModuleConfiguration] -> EventloopSetupConfiguration progstateT [beginProgstate] :: EventloopSetupConfiguration progstateT -> progstateT [eventloopF] :: EventloopSetupConfiguration progstateT -> progstateT -> In -> (progstateT, [Out]) [setupModuleConfigurations] :: EventloopSetupConfiguration progstateT -> [EventloopSetupModuleConfiguration] data EventloopSetupModuleConfiguration EventloopSetupModuleConfiguration :: EventloopModuleIdentifier -> Maybe Initializer -> Maybe EventRetriever -> Maybe PreProcessor -> Maybe PostProcessor -> Maybe EventSender -> Maybe Teardown -> EventloopSetupModuleConfiguration [moduleIdentifier] :: EventloopSetupModuleConfiguration -> EventloopModuleIdentifier [initializerF] :: EventloopSetupModuleConfiguration -> Maybe Initializer [eventRetrieverF] :: EventloopSetupModuleConfiguration -> Maybe EventRetriever [preprocessorF] :: EventloopSetupModuleConfiguration -> Maybe PreProcessor [postprocessorF] :: EventloopSetupModuleConfiguration -> Maybe PostProcessor [eventSenderF] :: EventloopSetupModuleConfiguration -> Maybe EventSender [teardownF] :: EventloopSetupModuleConfiguration -> Maybe Teardown data SharedIOConstants SharedIOConstants :: SafePrintToken -> (CanvasText -> IO ScreenDimensions) -> SharedIOConstants [safePrintToken] :: SharedIOConstants -> SafePrintToken [measureText] :: SharedIOConstants -> CanvasText -> IO ScreenDimensions data SharedIOState SharedIOState :: SharedIOState data IOConstants MouseConstants :: ClientSocket -> Connection -> ServerSocket -> IOConstants [clientSocket] :: IOConstants -> ClientSocket [clientConnection] :: IOConstants -> Connection [serverSocket] :: IOConstants -> ServerSocket KeyboardConstants :: ClientSocket -> Connection -> ServerSocket -> IOConstants [clientSocket] :: IOConstants -> ClientSocket [clientConnection] :: IOConstants -> Connection [serverSocket] :: IOConstants -> ServerSocket CanvasConstants :: CanvasSystemReceiveBuffer -> ClientSocket -> Connection -> ServerSocket -> IOConstants [canvasSystemReceiveBuffer] :: IOConstants -> CanvasSystemReceiveBuffer [clientSocket] :: IOConstants -> ClientSocket [clientConnection] :: IOConstants -> Connection [serverSocket] :: IOConstants -> ServerSocket StdInConstants :: BlockingConcurrentQueue StdInIn -> IOConstants [stdInInQueue] :: IOConstants -> BlockingConcurrentQueue StdInIn TimerConstants :: BlockingConcurrentQueue TimerIn -> IOConstants [tickInQueue] :: IOConstants -> BlockingConcurrentQueue TimerIn FileConstants :: BlockingConcurrentQueue FileIn -> IOConstants [fileInQueue] :: IOConstants -> BlockingConcurrentQueue FileIn NoConstants :: IOConstants data IOState TimerState :: [StartedTimer] -> [StartedTimer] -> IOState [startedIntervalTimers] :: IOState -> [StartedTimer] [startedTimers] :: IOState -> [StartedTimer] FileState :: [OpenFile] -> IOState [opened] :: IOState -> [OpenFile] StatefulGraphicsState :: GraphicsStates -> IOState [states] :: IOState -> GraphicsStates NoState :: IOState instance GHC.Show.Show Eventloop.Types.System.IOConstants module Eventloop.Module.DrawTrees data DrawTreesOut DrawTrees :: CanvasId -> [GeneralTree] -> DrawTreesOut data NodeColor NodeRed :: NodeColor NodeBlack :: NodeColor NodeGrey :: NodeColor data RBTree RBNode :: NodeColor -> String -> [RBTree] -> RBTree data RoseTree RoseNode :: String -> [RoseTree] -> RoseTree setupDrawTreesModuleConfiguration :: EventloopSetupModuleConfiguration drawTreesModuleIdentifier :: EventloopModuleIdentifier drawTreesPostProcessor :: PostProcessor showGeneralTreeList :: [GeneralTree] -> (Shape, RightOffset, BottomOffset) rbExampleTree :: RBTree roseExampleTree :: RoseTree -- | Convert to a RoseTree class ToRoseTree a where toRoseTree = genericToRoseTree -- | Convert to a RoseTree toRoseTree :: ToRoseTree a => a -> RoseTree -- | Convert to a RoseTree toRoseTree :: (ToRoseTree a, Generic a, GToRoseTree (Rep a)) => a -> RoseTree -- | A version of toRoseTree that works for any data type that has -- an instance for Generic genericToRoseTree :: (Generic a, GToRoseTree (Rep a)) => a -> RoseTree module Eventloop.Module.File setupFileModuleConfiguration :: EventloopSetupModuleConfiguration fileModuleIdentifier :: EventloopModuleIdentifier fileEventRetriever :: EventRetriever fileEventSender :: EventSender fileTeardown :: Teardown type OpenFile = (FilePath, Handle, IOMode) data FileIn FileOpened :: FilePath -> Bool -> FileIn FileClosed :: FilePath -> Bool -> FileIn RetrievedContents :: FilePath -> [[Char]] -> FileIn RetrievedLine :: FilePath -> [Char] -> FileIn RetrievedChar :: FilePath -> Char -> FileIn IsEOF :: FilePath -> Bool -> FileIn WroteTo :: FilePath -> Bool -> FileIn data FileOut OpenFile :: FilePath -> IOMode -> FileOut CloseFile :: FilePath -> FileOut RetrieveContents :: FilePath -> FileOut RetrieveLine :: FilePath -> FileOut RetrieveChar :: FilePath -> FileOut IfEOF :: FilePath -> FileOut WriteTo :: FilePath -> [Char] -> FileOut module Eventloop.Module.StdIn setupStdInModuleConfiguration :: EventloopSetupModuleConfiguration stdInModuleIdentifier :: EventloopModuleIdentifier stdInInitializer :: Initializer stdInEventRetriever :: EventRetriever stdInEventSender :: EventSender data StdInIn StdInReceivedContents :: [[Char]] -> StdInIn StdInReceivedLine :: [Char] -> StdInIn StdInReceivedChar :: Char -> StdInIn data StdInOut StdInReceiveContents :: StdInOut StdInReceiveLine :: StdInOut StdInReceiveChar :: StdInOut module Eventloop.Module.StdOut setupStdOutModuleConfiguration :: EventloopSetupModuleConfiguration stdOutModuleIdentifier :: EventloopModuleIdentifier stdOutEventSender :: EventSender data StdOutOut StdOutMessage :: [Char] -> StdOutOut module Eventloop.Module.Timer setupTimerModuleConfiguration :: EventloopSetupModuleConfiguration timerModuleIdentifier :: EventloopModuleIdentifier timerInitializer :: Initializer timerEventRetriever :: EventRetriever timerEventSender :: EventSender timerTeardown :: Teardown type MicroSecondDelay = Int type TimerId = [Char] type TickBuffer = BlockingConcurrentQueue TimerIn type StartedTimer = (TimerId, TimerIO) type TimerStartFunction = TimerIO -> IO () -> Delay -> IO Bool data TimerIn Tick :: TimerId -> TimerIn data TimerOut SetTimer :: TimerId -> MicroSecondDelay -> TimerOut SetIntervalTimer :: TimerId -> MicroSecondDelay -> TimerOut UnsetTimer :: TimerId -> TimerOut module Eventloop.Module.Websocket.Canvas setupCanvasModuleConfiguration :: EventloopSetupModuleConfiguration canvasModuleIdentifier :: EventloopModuleIdentifier canvasInitializer :: Initializer canvasEventRetriever :: EventRetriever canvasEventSender :: EventSender type CanvasSystemReceiveBuffer = MVar SystemCanvasIn type Opcode = Int type ScreenMetric = Int type ScreenX = ScreenMetric type ScreenY = ScreenMetric type ScreenWidth = ScreenMetric type ScreenHeight = ScreenMetric type ScreenRadius = ScreenMetric type ScreenAngle = ScreenMetric In degrees type ScreenPoint = (ScreenX, ScreenY) type ScreenDimensions = (ScreenWidth, ScreenHeight) type ScreenStartingPoint = ScreenPoint type ScreenControlPoint = ScreenPoint type ScreenEndPoint = ScreenPoint type ScreenStartingAngle = ScreenAngle type ScreenEndAngle = ScreenAngle type CanvasId = NumericId type ZIndex = Int type ScreenColorMetric = Int type ScreenRed = ScreenColorMetric type ScreenGreen = ScreenColorMetric type ScreenBlue = ScreenColorMetric type ScreenAlpha = Float type ScreenColor = (ScreenRed, ScreenGreen, ScreenBlue, ScreenAlpha) type ScreenPixel = ScreenColor type ColorStopOffset = Float type ScreenCircle = (ScreenPoint, ScreenRadius) type ScaleUnit = Float type ScaleX = ScaleUnit type ScaleY = ScaleUnit type ScreenLineThickness = Float type FontFamily = [Char] type FontSize = Int data RoutedMessageIn InUserCanvas :: CanvasIn -> RoutedMessageIn InSystemCanvas :: SystemCanvasIn -> RoutedMessageIn data RoutedMessageOut OutUserCanvas :: CanvasOut -> RoutedMessageOut OutSystemCanvas :: SystemCanvasOut -> RoutedMessageOut -- | Opcode: 2100 data SystemCanvasIn -- | Opcode: 2101 SystemMeasuredText :: CanvasText -> ScreenDimensions -> SystemCanvasIn -- | Opcode: 2000 data SystemCanvasOut -- | Opcode: 2001 SystemMeasureText :: CanvasText -> SystemCanvasOut -- | Opcode: 0100 data CanvasIn -- | Opcode: 0101 MeasuredText :: CanvasText -> ScreenDimensions -> CanvasIn -- | Reserved type words Type: t | Opcode Arguments: a | List of arguments -- for that data type Route: r | Either s for system or -- u for user Object: o | The object that is beneath -- -- Example: {r: s, o: {SystemMeasuredText -- object}} -- -- SystemMeasuredText object: {t:2102, a:[CanvasId, -- CanvasText object, ScreenDimensions]} -- -- Opcode: 0200 data CanvasOut -- | Opcode: 0201 SetupCanvas :: CanvasId -> ZIndex -> ScreenDimensions -> CSSPosition -> CanvasOut -- | Opcode: 0202 TeardownCanvas :: CanvasId -> CanvasOut -- | Opcode: 0203 CanvasOperations :: CanvasId -> [CanvasOperation] -> CanvasOut -- | Opcode: 0204 MeasureText :: CanvasText -> CanvasOut -- | Opcode: 0300 data CanvasOperation -- | Opcode: 0301 DrawPath :: ScreenStartingPoint -> [ScreenPathPart] -> PathStroke -> PathFill -> CanvasOperation -- | Opcode: 0302 DrawText :: CanvasText -> ScreenPoint -> TextStroke -> TextFill -> CanvasOperation -- | Opcode: 0303 DoTransform :: CanvasTransform -> CanvasOperation -- | Opcode: 0304 Clear :: ClearPart -> CanvasOperation -- | Opcode: 0305 Frame :: CanvasOperation -- | Opcode: 0400 data ScreenPathPart -- | Opcode: 0401 MoveTo :: ScreenPoint -> ScreenPathPart -- | Opcode: 0402 LineTo :: ScreenPoint -> ScreenPathPart -- | Opcode: 0403 BezierCurveTo :: ScreenControlPoint -> ScreenControlPoint -> ScreenEndPoint -> ScreenPathPart -- | Opcode: 0404 QuadraticCurveTo :: ScreenControlPoint -> ScreenEndPoint -> ScreenPathPart -- | Opcode: 0405 ArcTo :: ScreenControlPoint -> ScreenControlPoint -> ScreenRadius -> ScreenPathPart -- | Opcode: 0406 Arc :: ScreenCircle -> ScreenStartingAngle -> ScreenEndAngle -> ScreenPathPart -- | Opcode: 0407 Rectangle :: ScreenPoint -> ScreenDimensions -> ScreenPathPart -- | Opcode: 0408 ClosePath :: ScreenPathPart -- | Opcode: 0500 type PathRenderStrokeStyle = RenderStyle data PathStroke -- | Opcode: 0501 PathStroke :: ScreenLineThickness -> PathRenderStrokeStyle -> PathStroke -- | Opcode: 0502 NoPathStroke :: PathStroke -- | Opcode: 0600 type PathRenderFillStyle = RenderStyle data PathFill -- | Opcode: 0601 PathFill :: PathRenderFillStyle -> PathFill -- | Opcode: 0602 NoPathFill :: PathFill -- | Opcode: 0700 type CanvasColorStop = (ColorStopOffset, ScreenColor) data RenderStyle -- | Opcode: 0701 CanvasColor :: ScreenColor -> RenderStyle -- | Opcode:0702 CanvasGradient :: CanvasGradientType -> [CanvasColorStop] -> RenderStyle -- | Opcode: 0703 CanvasPattern :: CanvasImage -> PatternRepetition -> RenderStyle -- | Opcode: 0800 data CanvasImage -- | Opcode: 0801 CanvasElement :: CanvasId -> ScreenPoint -> ScreenDimensions -> CanvasImage -- | Opcode: 0802 [ScreenPixel] should be as long as width * height * 4. -- Each quad is red,green,blue,alpha ImageData :: ScreenDimensions -> [ScreenPixel] -> CanvasImage -- | Opcode: 0900 data PatternRepetition -- | Opcode: 0901 Repeat :: PatternRepetition -- | Opcode: 0902 RepeatX :: PatternRepetition -- | Opcode: 0903 RepeatY :: PatternRepetition -- | Opcode: 0904 NoRepeat :: PatternRepetition -- | Opcode: 1000 data CanvasGradientType -- | Opcode: 1001 First circle = inner circle, Second circle is enclosing -- circle RadialGradient :: ScreenCircle -> ScreenCircle -> CanvasGradientType -- | Opcode: 1002 LinearGradient :: ScreenPoint -> ScreenPoint -> CanvasGradientType -- | Opcode: 1200 data CanvasText -- | Opcode: 1201 CanvasText :: [Char] -> Font -> Alignment -> CanvasText -- | Opcode: 1300 data Font -- | Opcode: 1301 Font :: FontFamily -> FontSize -> Font -- | Opcode: 1400 type TextStrokeRenderStyle = RenderStyle type TextFillRenderStyle = RenderStyle data TextStroke -- | Opcode: 1401 TextStroke :: ScreenLineThickness -> TextStrokeRenderStyle -> TextStroke -- | Opcode: 1402 NoTextStroke :: TextStroke -- | Opcode: 2400 data TextFill -- | Opcode: 2401 TextFill :: TextFillRenderStyle -> TextFill -- | Opcode: 2402 NoTextFill :: TextFill -- | Opcode: 1500 data Alignment -- | Opcode: 1501 AlignLeft :: Alignment -- | Opcode: 1502 AlignRight :: Alignment -- | Opcode: 1503 AlignCenter :: Alignment -- | Opcode: 1600 type TransformUnit = Float type TransformationMatrix = (TransformUnit, TransformUnit, TransformUnit, TransformUnit, TransformUnit, TransformUnit) data CanvasTransform -- | Opcode: 1601 Save :: CanvasTransform -- | Opcode: 1602 Restore :: CanvasTransform -- | Opcode: 1603 Translate :: ScreenPoint -> CanvasTransform -- | Opcode: 1604 Rotate :: ScreenAngle -> CanvasTransform -- | Opcode: 1605 Scale :: ScaleX -> ScaleY -> CanvasTransform -- | Opcode: 1606 Transform :: TransformationMatrix -> CanvasTransform -- | Opcode: 1607 SetTransform :: TransformationMatrix -> CanvasTransform -- | Opcode: 1608 ResetTransform :: CanvasTransform -- | Opcode: 2200 type CSSLeftOffset = CSSUnit type CSSTopOffset = CSSUnit type CSSMeasurements = (CSSLeftOffset, CSSTopOffset) data CSSPosition -- | Opcode: 2201 CSSPosition :: CSSBindPoint -> CSSMeasurements -> CSSPosition -- | Opcode: 2300 data CSSBindPoint -- | Opcode: 2301 CSSFromCenter :: CSSBindPoint -- | Opcode: 2302 Usually this is the top left corner of the element CSSFromDefault :: CSSBindPoint -- | Opcode: 1800 data CSSUnit -- | Opcode: 1801 CSSPixels :: Int -> CSSUnit -- | Opcode: 1802 CSSPercentage :: Int -> CSSUnit -- | Opcode: 1900 data ClearPart -- | Opcode: 1901 ClearRectangle :: ScreenPoint -> ScreenDimensions -> ClearPart -- | Opcode: 1902 ClearCanvas :: ClearPart module Eventloop.Module.Websocket.Keyboard setupKeyboardModuleConfiguration :: EventloopSetupModuleConfiguration keyboardModuleIdentifier :: EventloopModuleIdentifier keyboardInitializer :: Initializer keyboardEventRetriever :: EventRetriever keyboardEventSender :: EventSender -- | Almost all key presses are registered including modifier keys. Expect -- character keys to come in as their character. Press a c, get a "c". If -- a modifier is used and a different character is expected, it will be -- that instead. Press shift + c, get a C. Modifiers are also sent -- as their string representation: "shift", "ctrl" or "alt". Space is -- expected as "space". data Keyboard Key :: [Char] -> Keyboard module Eventloop.Module.Websocket.Mouse setupMouseModuleConfiguration :: EventloopSetupModuleConfiguration mouseModuleIdentifier :: EventloopModuleIdentifier mouseInitializer :: Initializer mouseEventRetriever :: EventRetriever mouseEventSender :: EventSender data MouseIn Mouse :: MouseType -> NumericId -> MouseEvent -> Point -> MouseIn data MouseType MouseCanvas :: MouseType MouseSVG :: MouseType data MouseEvent Click :: MouseButton -> MouseEvent DoubleClick :: MouseButton -> MouseEvent MouseMove :: MouseEvent MouseDown :: MouseButton -> MouseEvent MouseUp :: MouseButton -> MouseEvent MouseEnter :: MouseEvent MouseLeave :: MouseEvent data MouseButton MouseLeft :: MouseButton MouseRight :: MouseButton MouseMiddle :: MouseButton module Eventloop.Module.BasicShapes setupBasicShapesModuleConfiguration :: EventloopSetupModuleConfiguration basicShapesModuleIdentifier :: EventloopModuleIdentifier basicShapesPostProcessor :: PostProcessor type GraphicalNumeric = Float type Position = Point type Width = GraphicalNumeric type Height = GraphicalNumeric type Dimensions = (Width, Height) type Radius = GraphicalNumeric type Red = GraphicalNumeric type Green = GraphicalNumeric type Blue = GraphicalNumeric type Alpha = GraphicalNumeric type Color = (Red, Green, Blue, Alpha) type FillColor = Color type StrokeColor = Color type FillThickness = GraphicalNumeric type StrokeLineThickness = GraphicalNumeric type UpperLeft = Point type UpperRight = Point type LowerLeft = Point type LowerRight = Point type NumberOfPoints = Int type FontFamily = [Char] type FontSize = GraphicalNumeric data BasicShapesOut DrawShapes :: CanvasId -> [Shape] -> BasicShapesOut data Shape -- | Should contain atleast 1 shape. Rotation before Position CompositeShape :: [Shape] -> Maybe Position -> Maybe Rotation -> Shape [shapes] :: Shape -> [Shape] [positionM] :: Shape -> Maybe Position [rotationM] :: Shape -> Maybe Rotation -- | | Position is upperleftcorner. Position is the corner closes to -- origin. Visually in canvas, this is top left. In a Cartesian -- coördinate system, this is bottom left. Rectangle :: Position -> Dimensions -> FillColor -> StrokeLineThickness -> StrokeColor -> Maybe Rotation -> Shape [position] :: Shape -> Position [dimensions] :: Shape -> Dimensions [fillColor] :: Shape -> FillColor [strokeLineThickness] :: Shape -> StrokeLineThickness [strokeColor] :: Shape -> StrokeColor [rotationM] :: Shape -> Maybe Rotation -- | | Position is center Circle :: Position -> Radius -> FillColor -> StrokeLineThickness -> StrokeColor -> Maybe Rotation -> Shape [position] :: Shape -> Position [radius] :: Shape -> Radius [fillColor] :: Shape -> FillColor [strokeLineThickness] :: Shape -> StrokeLineThickness [strokeColor] :: Shape -> StrokeColor [rotationM] :: Shape -> Maybe Rotation -- | The first point of the regular polygon, always starts in the direction -- from the x-axis.(Towards x-infinity). Position is the the centre of -- the regular polygon RegularPolygon :: Position -> NumberOfPoints -> Radius -> FillColor -> StrokeLineThickness -> StrokeColor -> Maybe Rotation -> Shape [position] :: Shape -> Position [numberOfPoints] :: Shape -> NumberOfPoints [radius] :: Shape -> Radius [fillColor] :: Shape -> FillColor [strokeLineThickness] :: Shape -> StrokeLineThickness [strokeColor] :: Shape -> StrokeColor [rotationM] :: Shape -> Maybe Rotation Text :: [Char] -> FontFamily -> FontSize -> Position -> Alignment -> FillColor -> StrokeLineThickness -> StrokeColor -> Maybe Rotation -> Shape [text] :: Shape -> [Char] [fontFamily] :: Shape -> FontFamily [fontSize] :: Shape -> FontSize [position] :: Shape -> Position [alignment] :: Shape -> Alignment [fillColor] :: Shape -> FillColor [strokeLineThickness] :: Shape -> StrokeLineThickness [strokeColor] :: Shape -> StrokeColor [rotationM] :: Shape -> Maybe Rotation Line :: Point -> Point -> StrokeLineThickness -> StrokeColor -> Maybe Rotation -> Shape [point1] :: Shape -> Point [point2] :: Shape -> Point [strokeLineThickness] :: Shape -> StrokeLineThickness [strokeColor] :: Shape -> StrokeColor [rotationM] :: Shape -> Maybe Rotation MultiLine :: [Point] -> StrokeLineThickness -> StrokeColor -> Maybe Rotation -> Shape -- | | Can contain any number of points [points] :: Shape -> [Point] [strokeLineThickness] :: Shape -> StrokeLineThickness [strokeColor] :: Shape -> StrokeColor [rotationM] :: Shape -> Maybe Rotation FilledMultiLine :: [Point] -> FillThickness -> FillColor -> StrokeLineThickness -> StrokeColor -> Maybe Rotation -> Shape -- | | Can contain any number of points [points] :: Shape -> [Point] [fillWidth] :: Shape -> FillThickness [fillColor] :: Shape -> FillColor [strokeLineThickness] :: Shape -> StrokeLineThickness [strokeColor] :: Shape -> StrokeColor [rotationM] :: Shape -> Maybe Rotation Polygon :: [Point] -> FillColor -> StrokeLineThickness -> StrokeColor -> Maybe Rotation -> Shape -- | | Can contain any number of points [points] :: Shape -> [Point] [fillColor] :: Shape -> FillColor [strokeLineThickness] :: Shape -> StrokeLineThickness [strokeColor] :: Shape -> StrokeColor [rotationM] :: Shape -> Maybe Rotation data Rotation -- | | Rotation is around a point on the canvas. May be the centre of the -- boundingbox (enclosing rectangle) or an arbitrary point. Angle is in -- degrees and counter-clockwise in the coördinate system(from the x-axis -- to the y-axis) and visually on canvas clock-wise. Rotation :: RotatePoint -> Angle -> Rotation data RotatePoint AroundCenter :: RotatePoint AroundPoint :: Point -> RotatePoint data BoundingBox -- | | The point indications are from the perspective of a regular -- Cartesian coördinate system. BoundingBox :: LowerLeft -> UpperLeft -> UpperRight -> LowerRight -> BoundingBox type CanvasId = NumericId -- | Opcode: 1500 data Alignment -- | Opcode: 1501 AlignLeft :: Alignment -- | Opcode: 1502 AlignRight :: Alignment -- | Opcode: 1503 AlignCenter :: Alignment data GeometricPrimitive Points :: [Point] -> GeometricPrimitive CircleArea :: Point -> Radius -> GeometricPrimitive opOnBoundingBox :: (Point -> Point) -> BoundingBox -> BoundingBox allRegularPolygonPoints :: NumberOfPoints -> Point -> Radius -> [Point] boundingBoxFromPrimitives :: [GeometricPrimitive] -> BoundingBox normalizeBBox :: BoundingBox -> BoundingBox roundPoint :: Point -> ScreenPoint roundColor :: Color -> ScreenColor strokePointsForLine :: StrokeLineThickness -> Point -> Point -> [Point] strokePointsForConnection :: StrokeLineThickness -> Point -> Point -> Point -> [Point] strokePoints :: StrokeLineThickness -> [Point] -> [Point] strokePointsClosedPath :: StrokeLineThickness -> [Point] -> [Point] class ToPrimitives a toPrimitives :: ToPrimitives a => a -> [GeometricPrimitive] class ToCenter a toCenter :: ToCenter a => a -> Point class (ToPrimitives a) => ToBoundingBox a toBoundingBox :: ToBoundingBox a => a -> BoundingBox class (ToBoundingBox a) => Overlaps a where overlaps a1 a2 | contains a1 a2 || contains a2 a1 = False | xMax b1 < xMin b2 = False | xMin b1 > xMax b2 = False | yMax b1 < yMin b2 = False | yMin b1 > yMax b2 = False | otherwise = True where b1 = toBoundingBox a1 b2 = toBoundingBox a2 contains a1 a2 | xMax b2 <= xMax b1 && xMin b2 >= xMin b1 && yMax b2 <= yMax b1 && yMin b2 >= yMin b1 = True | otherwise = False where b1 = toBoundingBox a1 b2 = toBoundingBox a2 touches a1 a2 = overlaps a1 a2 || contains a1 a2 || contains a2 a1 overlaps :: (Overlaps a, Overlaps b) => a -> b -> Bool contains :: (Overlaps a, Overlaps b) => a -> b -> Bool touches :: (Overlaps a, Overlaps b) => a -> b -> Bool findRotationPoint :: (ToCenter a) => a -> Rotation -> Point class ToCanvasOut a toCanvasOut :: ToCanvasOut a => a -> CanvasOut class ToCanvasOperations a toCanvasOperations :: ToCanvasOperations a => a -> [CanvasOperation] toCanvasText :: Shape -> CanvasText class ToScreenPathPart a toScreenPathParts :: ToScreenPathPart a => a -> Maybe ([ScreenPathPart], ScreenStartingPoint) toCanvasPathFill :: Shape -> PathFill hasCanvasPathFill :: Shape -> Bool allScreenPolygonPoints :: Shape -> [Point] module Eventloop.Module.Graphs setupGraphsModuleConfiguration :: EventloopSetupModuleConfiguration graphsModuleIdentifier :: EventloopModuleIdentifier nodeRadius :: Float textSize :: Float textFont :: [Char] xArrowSize :: Float yArrowSize :: Float weightHeight :: Float dimCanvasGraphs :: (Float, Float) roundDimCanvasGraphs :: (Int, Int) canvasGraphsWidth :: Float canvasGraphsHeight :: Float instructionsHeight :: Float instructionsBeginAt :: Float canvasInstrWidth :: Float canvasInstrHeight :: Float dimCanvasInstr :: (Float, Float) roundDimCanvasInstr :: (Int, Int) canvasIdGraphs :: CanvasId canvasIdInstructions :: CanvasId -- | Checkes to see if there is a node on a certain position onNode :: [Node] -> Pos -> Maybe Node -- | Abstracts the standardized EventTypes to GraphsIn graphsPreProcessor :: PreProcessor -- | Abstracts GraphsOut back to BasicShapes and -- Canvas events graphsPostProcessor :: PostProcessor -- | Translates color datatype to RGBA codes colorToRGBAColor :: Color -> Color -- | Translates the thickness to a float thicknessToFloat :: Thickness -> StrokeLineThickness findNode :: [Node] -> Label -> Node graphToShapes :: Graph -> [Shape] nodeToShapes :: Node -> [Shape] edgeToShapes :: Node -> Node -> Edge -> Directed -> Weighted -> [Shape] -- | Returns the point when making a step f long from the point start in -- the direction of the vector. The length between start pos and result -- pos is always f. posOnVector :: Float -> Vector -> Pos -> Pos -- | Vector from p1 to p2 vectorize :: Pos -> Pos -> Vector -- | Returns the vector perpendicular on the given vector between the 2 -- points. Always has positive y and vector length 1; y is inverted in -- canvas downPerpendicularTo :: Pos -> Pos -> Vector -- | Returns the vector perpendicular on the given vector between the 2 -- points. Always has negative y and vector length 1; y is inverted in -- canvas upPerpendicularTo :: Pos -> Pos -> Vector -- | Returns the size of the vector vectorSize :: Vector -> Float type Pos = (Float, Float) type Vector = (Float, Float) data GraphsIn Mouse :: MouseEvent -> Pos -> GraphsIn Key :: [Char] -> GraphsIn data GraphsOut SetupGraphs :: GraphsOut DrawGraph :: Graph -> GraphsOut Instructions :: [String] -> GraphsOut type Label = Char type Weight = Float type Node = (Label, Pos, Color) type Edge = (Label, Label, Color, Weight, Thickness) data Graph Graph :: [Node] -> [Edge] -> Directed -> Weighted -> Graph [nodes] :: Graph -> [Node] [edges] :: Graph -> [Edge] [directed] :: Graph -> Directed [weighted] :: Graph -> Weighted data Color Red :: Color Blue :: Color Green :: Color Purple :: Color Grey :: Color Yellow :: Color Orange :: Color Black :: Color White :: Color data Thickness Thin :: Thickness Thick :: Thickness data Directed Directed :: Directed Undirected :: Directed data Weighted Weighted :: Weighted Unweighted :: Weighted data MouseEvent Click :: MouseButton -> MouseEvent DoubleClick :: MouseButton -> MouseEvent MouseMove :: MouseEvent MouseDown :: MouseButton -> MouseEvent MouseUp :: MouseButton -> MouseEvent MouseEnter :: MouseEvent MouseLeave :: MouseEvent data MouseButton MouseLeft :: MouseButton MouseRight :: MouseButton MouseMiddle :: MouseButton module Eventloop.Module.StatefulGraphics setupStatefulGraphicsModuleConfiguration :: EventloopSetupModuleConfiguration statefulGraphicsModuleIdentifier :: EventloopModuleIdentifier statefulGraphicsInitializer :: Initializer statefulGraphicsPostProcessor :: PostProcessor type CanvasSystemReceiveBuffer = MVar SystemCanvasIn type Opcode = Int type ScreenMetric = Int type ScreenX = ScreenMetric type ScreenY = ScreenMetric type ScreenWidth = ScreenMetric type ScreenHeight = ScreenMetric type ScreenRadius = ScreenMetric type ScreenAngle = ScreenMetric In degrees type ScreenPoint = (ScreenX, ScreenY) type ScreenDimensions = (ScreenWidth, ScreenHeight) type ScreenStartingPoint = ScreenPoint type ScreenControlPoint = ScreenPoint type ScreenEndPoint = ScreenPoint type ScreenStartingAngle = ScreenAngle type ScreenEndAngle = ScreenAngle type CanvasId = NumericId type ZIndex = Int type ScreenColorMetric = Int type ScreenRed = ScreenColorMetric type ScreenGreen = ScreenColorMetric type ScreenBlue = ScreenColorMetric type ScreenAlpha = Float type ScreenColor = (ScreenRed, ScreenGreen, ScreenBlue, ScreenAlpha) type ScreenPixel = ScreenColor type ColorStopOffset = Float type ScreenCircle = (ScreenPoint, ScreenRadius) type ScaleUnit = Float type ScaleX = ScaleUnit type ScaleY = ScaleUnit type ScreenLineThickness = Float type FontFamily = [Char] type FontSize = Int data RoutedMessageIn InUserCanvas :: CanvasIn -> RoutedMessageIn InSystemCanvas :: SystemCanvasIn -> RoutedMessageIn data RoutedMessageOut OutUserCanvas :: CanvasOut -> RoutedMessageOut OutSystemCanvas :: SystemCanvasOut -> RoutedMessageOut -- | Opcode: 2100 data SystemCanvasIn -- | Opcode: 2101 SystemMeasuredText :: CanvasText -> ScreenDimensions -> SystemCanvasIn -- | Opcode: 2000 data SystemCanvasOut -- | Opcode: 2001 SystemMeasureText :: CanvasText -> SystemCanvasOut -- | Opcode: 0100 data CanvasIn -- | Opcode: 0101 MeasuredText :: CanvasText -> ScreenDimensions -> CanvasIn -- | Reserved type words Type: t | Opcode Arguments: a | List of arguments -- for that data type Route: r | Either s for system or -- u for user Object: o | The object that is beneath -- -- Example: {r: s, o: {SystemMeasuredText -- object}} -- -- SystemMeasuredText object: {t:2102, a:[CanvasId, -- CanvasText object, ScreenDimensions]} -- -- Opcode: 0200 data CanvasOut -- | Opcode: 0201 SetupCanvas :: CanvasId -> ZIndex -> ScreenDimensions -> CSSPosition -> CanvasOut -- | Opcode: 0202 TeardownCanvas :: CanvasId -> CanvasOut -- | Opcode: 0203 CanvasOperations :: CanvasId -> [CanvasOperation] -> CanvasOut -- | Opcode: 0204 MeasureText :: CanvasText -> CanvasOut -- | Opcode: 0300 data CanvasOperation -- | Opcode: 0301 DrawPath :: ScreenStartingPoint -> [ScreenPathPart] -> PathStroke -> PathFill -> CanvasOperation -- | Opcode: 0302 DrawText :: CanvasText -> ScreenPoint -> TextStroke -> TextFill -> CanvasOperation -- | Opcode: 0303 DoTransform :: CanvasTransform -> CanvasOperation -- | Opcode: 0304 Clear :: ClearPart -> CanvasOperation -- | Opcode: 0305 Frame :: CanvasOperation -- | Opcode: 0400 data ScreenPathPart -- | Opcode: 0401 MoveTo :: ScreenPoint -> ScreenPathPart -- | Opcode: 0402 LineTo :: ScreenPoint -> ScreenPathPart -- | Opcode: 0403 BezierCurveTo :: ScreenControlPoint -> ScreenControlPoint -> ScreenEndPoint -> ScreenPathPart -- | Opcode: 0404 QuadraticCurveTo :: ScreenControlPoint -> ScreenEndPoint -> ScreenPathPart -- | Opcode: 0405 ArcTo :: ScreenControlPoint -> ScreenControlPoint -> ScreenRadius -> ScreenPathPart -- | Opcode: 0406 Arc :: ScreenCircle -> ScreenStartingAngle -> ScreenEndAngle -> ScreenPathPart -- | Opcode: 0407 Rectangle :: ScreenPoint -> ScreenDimensions -> ScreenPathPart -- | Opcode: 0408 ClosePath :: ScreenPathPart -- | Opcode: 0500 type PathRenderStrokeStyle = RenderStyle data PathStroke -- | Opcode: 0501 PathStroke :: ScreenLineThickness -> PathRenderStrokeStyle -> PathStroke -- | Opcode: 0502 NoPathStroke :: PathStroke -- | Opcode: 0600 type PathRenderFillStyle = RenderStyle data PathFill -- | Opcode: 0601 PathFill :: PathRenderFillStyle -> PathFill -- | Opcode: 0602 NoPathFill :: PathFill -- | Opcode: 0700 type CanvasColorStop = (ColorStopOffset, ScreenColor) data RenderStyle -- | Opcode: 0701 CanvasColor :: ScreenColor -> RenderStyle -- | Opcode:0702 CanvasGradient :: CanvasGradientType -> [CanvasColorStop] -> RenderStyle -- | Opcode: 0703 CanvasPattern :: CanvasImage -> PatternRepetition -> RenderStyle -- | Opcode: 0800 data CanvasImage -- | Opcode: 0801 CanvasElement :: CanvasId -> ScreenPoint -> ScreenDimensions -> CanvasImage -- | Opcode: 0802 [ScreenPixel] should be as long as width * height * 4. -- Each quad is red,green,blue,alpha ImageData :: ScreenDimensions -> [ScreenPixel] -> CanvasImage -- | Opcode: 0900 data PatternRepetition -- | Opcode: 0901 Repeat :: PatternRepetition -- | Opcode: 0902 RepeatX :: PatternRepetition -- | Opcode: 0903 RepeatY :: PatternRepetition -- | Opcode: 0904 NoRepeat :: PatternRepetition -- | Opcode: 1000 data CanvasGradientType -- | Opcode: 1001 First circle = inner circle, Second circle is enclosing -- circle RadialGradient :: ScreenCircle -> ScreenCircle -> CanvasGradientType -- | Opcode: 1002 LinearGradient :: ScreenPoint -> ScreenPoint -> CanvasGradientType -- | Opcode: 1200 data CanvasText -- | Opcode: 1201 CanvasText :: [Char] -> Font -> Alignment -> CanvasText -- | Opcode: 1300 data Font -- | Opcode: 1301 Font :: FontFamily -> FontSize -> Font -- | Opcode: 1400 type TextStrokeRenderStyle = RenderStyle type TextFillRenderStyle = RenderStyle data TextStroke -- | Opcode: 1401 TextStroke :: ScreenLineThickness -> TextStrokeRenderStyle -> TextStroke -- | Opcode: 1402 NoTextStroke :: TextStroke -- | Opcode: 2400 data TextFill -- | Opcode: 2401 TextFill :: TextFillRenderStyle -> TextFill -- | Opcode: 2402 NoTextFill :: TextFill -- | Opcode: 1500 data Alignment -- | Opcode: 1501 AlignLeft :: Alignment -- | Opcode: 1502 AlignRight :: Alignment -- | Opcode: 1503 AlignCenter :: Alignment -- | Opcode: 1600 type TransformUnit = Float type TransformationMatrix = (TransformUnit, TransformUnit, TransformUnit, TransformUnit, TransformUnit, TransformUnit) data CanvasTransform -- | Opcode: 1601 Save :: CanvasTransform -- | Opcode: 1602 Restore :: CanvasTransform -- | Opcode: 1603 Translate :: ScreenPoint -> CanvasTransform -- | Opcode: 1604 Rotate :: ScreenAngle -> CanvasTransform -- | Opcode: 1605 Scale :: ScaleX -> ScaleY -> CanvasTransform -- | Opcode: 1606 Transform :: TransformationMatrix -> CanvasTransform -- | Opcode: 1607 SetTransform :: TransformationMatrix -> CanvasTransform -- | Opcode: 1608 ResetTransform :: CanvasTransform -- | Opcode: 2200 type CSSLeftOffset = CSSUnit type CSSTopOffset = CSSUnit type CSSMeasurements = (CSSLeftOffset, CSSTopOffset) data CSSPosition -- | Opcode: 2201 CSSPosition :: CSSBindPoint -> CSSMeasurements -> CSSPosition -- | Opcode: 2300 data CSSBindPoint -- | Opcode: 2301 CSSFromCenter :: CSSBindPoint -- | Opcode: 2302 Usually this is the top left corner of the element CSSFromDefault :: CSSBindPoint -- | Opcode: 1800 data CSSUnit -- | Opcode: 1801 CSSPixels :: Int -> CSSUnit -- | Opcode: 1802 CSSPercentage :: Int -> CSSUnit -- | Opcode: 1900 data ClearPart -- | Opcode: 1901 ClearRectangle :: ScreenPoint -> ScreenDimensions -> ClearPart -- | Opcode: 1902 ClearCanvas :: ClearPart data StatefulGraphicsOut Draw :: StatefulGraphic -> StatefulGraphicsOut Remove :: NamedId -> StatefulGraphicsOut data GraphicPerformed Drawn :: StatefulBB -> GraphicPerformed Modified :: StatefulBB -> StatefulBB -> GraphicPerformed Removed :: StatefulBB -> GraphicPerformed NoOp :: GraphicPerformed data StatefulGraphic Stateful :: NamedId -> ZIndex -> Shape -> StatefulGraphic data StatefulBB StatefulBB :: StatefulGraphic -> BoundingBox -> StatefulBB type GraphicsState = [StatefulBB] type GraphicsStates = [(CanvasId, GraphicsState)] class NoDimChange a noDimChange :: NoDimChange a => a -> a -> Bool module Eventloop.DefaultConfiguration allModulesEventloopSetupConfiguration :: progstateT -> (progstateT -> In -> (progstateT, [Out])) -> EventloopSetupConfiguration progstateT setupSharedIOConstants :: IO SharedIOConstants setupSharedIOState :: IO SharedIOState module Eventloop.Core -- | Starts the entire system. First the setup phase is handled to setup -- the different concurrent resources. This is followed by the -- initialization phase where all modules are initialised. Than, the -- different worker threads are spawned and finally the system thread -- will go to work as the eventloop thread. -- -- Shutting down is handled centrally through the system thread (main -- thread). If any of the threads(including the system thread) receive an -- exception, only the first exception is thrown to the system thread -- which will try to shutdown immediately. This exception is logged by -- the system thread. All other exceptions are logged by their respective -- threads. The system thread will than shutdown the worker threads. This -- is done by throwing exceptions to all workerthreads except sender -- threads. These are sent a Stop event. If they take longer than 1 -- second, to finish up, they will also be thrown an exception. startEventloopSystem :: EventloopSetupConfiguration progstateT -> IO () terminateWithinOrThrowException :: Int -> SomeException -> Thread -> IO TimerIO -- | Utility function in order to create the different thread actions in -- the system. Assumed is that the action requires the system -- configuration, the module configuration and some resource that may be -- available in the module configuration. threadActionsBasedOnModule :: EventloopSystemConfiguration progstateT -> (EventloopSystemConfiguration progstateT -> (EventloopModuleConfiguration, resource) -> IO ()) -> (EventloopModuleConfiguration -> Maybe resource) -> [EventloopModuleConfiguration] -> [IO ()] spawnWorkerThread :: EventloopSystemConfiguration progstateT -> (EventloopSystemConfiguration progstateT -> Thread -> IO ()) -> IO () -> IO () registerRetrieverThread :: EventloopSystemConfiguration progstateT -> Thread -> IO () registerOutRouterThread :: EventloopSystemConfiguration progstateT -> Thread -> IO () registerSenderThread :: EventloopSystemConfiguration progstateT -> Thread -> IO () throwShutdownExceptionToThread :: Thread -> IO () allWorkerThreads :: EventloopSystemConfiguration progstateT -> IO [Thread] retrieverThreads :: EventloopSystemConfiguration progstateT -> IO [Thread] outRouterThread :: EventloopSystemConfiguration progstateT -> IO [Thread] senderThreads :: EventloopSystemConfiguration progstateT -> IO [Thread]