module Reactogon.Global.Clock ( tempo
                              , metronome
                              , tempoToDTime
                              ) where

import Reactogon.Auxiliary.Auxiliary
import Reactogon.Semantics
import FRP.Yampa

import Debug.Trace

tempo :: Tempo -> SF () Tempo
tempo = constant

-- The initial value is arbitrary but never appears because the switch
-- is immediate.
metronome :: SF Tempo (Event Beat)
metronome = switch ((repeatedly (tempoToDTime 60) ())
                     &&&
                    (onChange')) (metronome')
  where metronome' :: Tempo -> SF Tempo (Event Beat)
        metronome' t = (switch ((repeatedly (tempoToDTime t) ())
                                 &&&
                                 onChange) (metronome'))

tempoToDTime :: Tempo -> DTime
tempoToDTime = (60/) . fromIntegral