{-# LANGUAGE DeriveDataTypeable #-}

import Control.Concurrent
import Control.Monad
import Control.Applicative

import Data.List
import Data.Typeable

import Control.Exception
import Prelude hiding(catch)
import Debug.Trace
import Data.Monoid
import Data.Max
import Data.AddBounds


import System.IO.Unsafe
import System.IO
import System.Mem
import System.Mem.Weak
import Control.Concurrent.MVar
import Control.Parallel.Strategies

import Data.Unamb
-- import Data.IsEvaluated

import FRP.Reactive
import FRP.Reactive.LegacyAdapters
import FRP.Reactive.PrimReactive
import FRP.Reactive.Internal.Reactive
import FRP.Reactive.Internal.Future


printFutures e | isNeverE e = print "never-never"
printFutures (Event (Future (t,a `Stepper` e))) = print (Future (t,a)) >> printFutures e

joinE (Event u) = Event (u >>= eFuture . g)
 where 
   g (v `Stepper` vs) = v `mappend` joinE vs


main = do
  hSetBuffering stdout NoBuffering
  let ev1  = countE_ $ atTimes [2,2.5,3.2,3.7]
      ev2  = countE_ $ atTimes [1,2.5,3,4]
      allE = fmap atTime ev1
  printFutures ev1
  printFutures $ joinE allE


