module FudgetIO where import Fudget import EitherUtils(Cont(..)) import Message(stripLow,stripHigh) {- The purpose of the FudgetIO class is to allow the many IO operations that can be performed from both fudgets and fudget kernels, e.g., createGC, loadQueryFont and allocNamedColor, to use one overloaded name instead of two separate names. -} class FudgetIO f where waitForMsg :: (KEvent hi -> Maybe ans) -> Cont (f hi ho) ans putMsg :: KCommand ho -> f hi ho -> f hi ho -- Less useful methods: --nullMsg :: f hi ho -- name ?! --getMsg :: (KEvent hi -> f hi ho) -> f hi ho putMsgs msgs k = foldr putMsg k msgs putHigh x = (putMsg . High) x putLow x = (putMsg . Low) x putLows lows k = foldr putLow k lows getHigh x = waitForMsg stripHigh x getLow x = waitForMsg stripLow x cmdContMsg msg expected = putMsg msg . waitForMsg expected cmdContLow cmd expected = cmdContMsg (Low cmd) expectLow where expectLow msg = stripLow msg >>= expected