packages feed

moffy-samples-events-0.1.0.0: src/Control/Moffy/Samples/Event/Mouse.hs

{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}

module Control.Moffy.Samples.Event.Mouse where

import Prelude hiding (repeat)

import Control.Moffy
import Data.Type.Set

data Button = ButtonPrimary | ButtonMiddle | ButtonSecondary deriving (Show, Eq)

data Down = DownReq deriving (Show, Eq, Ord)
numbered [t| Down |]
instance Request Down where data Occurred Down = OccDown Button deriving Show

down :: React s (Singleton Down) Button
down = await DownReq \(OccDown b) -> b

data Up = UpReq deriving (Show, Eq, Ord)
numbered [t| Up |]
instance Request Up where data Occurred Up = OccUp Button deriving Show

up :: React s (Singleton Up) Button
up = await UpReq \(OccUp b) -> b

data Move = MoveReq deriving (Show, Eq, Ord)
numbered [t| Move |]
instance Request Move where data Occurred Move = OccMove Point deriving Show
type Point = (Double, Double)

move :: React s (Singleton Move) Point
move = await MoveReq \(OccMove p) -> p

position :: Sig s (Singleton Move) Point r
position = repeat move

type Events = Move :- Down :- Up :- 'Nil