{-# LANGUAGE Arrows #-} module JuicyBar.Input.Pipe (readPipe) where import FRP.Grapefruit.Signal as Signal import FRP.Grapefruit.Signal.Discrete as DSignal import FRP.Grapefruit.Setup (Setup, fromIO) import FRP.Grapefruit.Circuit as Circuit import Control.Arrow as Arrow import Control.Concurrent import System.IO registerPipeReader :: FilePath -> (String -> IO ()) -> Setup registerPipeReader path handler = fromIO $ forkIO action >> return () where action = do h <- openFile path ReadMode loop h loop h = hGetLine h >>= handler >> loop h readPipe :: Circuit era FilePath (DSignal era String) readPipe = proc path -> do signal <- produce $ DSignal.producer $ registerPipeReader path -<< () returnA -< signal