summaryrefslogtreecommitdiff
path: root/testsuite/tests/typecheck/should_compile/Tc170_Aux.hs
blob: c7cd186f137f69dbd7fdcd763381dc3922c223c4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

module Tc170_Aux where

class ReadMode mode

data Attr m w a = Attr (w -> IO a) (w -> a -> IO ())  

mapAttr :: ReadMode m => (a -> b) -> (a -> b -> a) -> Attr m w a -> Attr m w b
mapAttr get set (Attr getter setter)
    = Attr (\w   -> do a <- getter w; return (get a))
           (\w b -> do a <- getter w; setter w (set a b))


data Rect  = Rect
data Point = Point
topLeft    = undefined
rectMoveTo = undefined

class Dimensions w where
  frame    :: ReadMode m => Attr m w Rect

  position :: ReadMode m => Attr m w Point
  position  = mapAttr (\f -> topLeft f) (\f p -> rectMoveTo p f) frame