{-# LANGUAGE TypeSynonymInstances  #-}
{-# LANGUAGE FlexibleInstances     #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies          #-}

import Control.EventDriven
import Control.Talk
import Control.Monad.State
import Control.Monad.Identity
import TestSample

newtype IntA a = IntA { getInt :: Int }

instance RefMonad ( State ( Int, [ TestTalker ] ) ) TestTalker where
  type Ref ( State ( Int, [ TestTalker ] ) ) = IntA
  newRef x     = do
    ( n, ss ) <- get
    put ( n + 1, ss ++ [ x ] )
    return $ IntA n
  readRef i    = gets ( \( _, ss ) -> ss !! getInt i )
  writeRef i x = do
    ( n, ss ) <- get
    put ( n, take ( getInt i ) ss ++ [ x ] ++ drop ( getInt i + 1 ) ss )

act :: State ( Int, [ TestTalker ] ) Int
act = do
  talker <- getTalker 0 keybind
  putEvent talker "succ"
  putEvent talker "succ"
  getContainer talker

main :: IO ()
main = print $ fst $ runState act ( 0, [] )
