module Control.CP.Mixin (
  Mixin,
  (<@>),
  mixin,
  mixinConst,
  mixinId
) where

type Mixin a = a -> a -> a

infixl 5 <@>
(<@>) :: Mixin a -> Mixin a -> Mixin a
(f1 <@> f2) s t = f1 (f2 s t) t

mixin :: Mixin a -> a
mixin f = let 
  x = f (error "super called in top-level mixin") x 
  in x

mixinConst :: a -> a -> a -> a
mixinConst _ _ c = c

mixinId :: Mixin a
mixinId s _ = s