{-# OPTIONS_GHC -fno-warn-redundant-constraints #-}

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

