> {-# LANGUAGE ExistentialQuantification, ScopedTypeVariables, FlexibleContexts, CPP #-} > module Euterpea.IO.MUI.UISFCompat where > import FRP.UISF.AuxFunctions > import FRP.UISF.UISF > import Control.SF.SF > import Control.Arrow.ArrowP > import Euterpea.IO.Audio.Types > import Control.DeepSeq > import Control.Concurrent (killThread, ThreadId) #if MIN_VERSION_UISF(0,4,0) > import FRP.UISF.Asynchrony > asyncUISFV x = asyncVT x #endif The below function is useful for making use of asyncUISF* which both make use of Automatons rather than SFs. NOTE: Actually, SF and Automaton (->) are the same thing. Perhaps we should replace our definition of SF with just a type synonym instead. > toAutomaton :: forall a b . SF a b -> Automaton (->) a b > toAutomaton ~(SF f) = Automaton $ \a -> let (b, sf) = f a in (b, toAutomaton sf) The below function is useful for directly asynchronizing AudSFs and CtrSFs in UISF. > clockedSFToUISF :: forall a b c . (NFData b, Clock c) => DeltaT -> SigFun c a b -> UISF a [(b, Time)] > clockedSFToUISF buffer ~(ArrowP sf) = let r = rate (undefined :: c) > in asyncUISFV r buffer (toAutomaton sf) This function is the standard UISF asynchronous thread handler: > uisfAsyncThreadHandler :: ThreadId -> UISF a a > uisfAsyncThreadHandler = addTerminationProc . killThread