essence-of-live-coding-0.1.0.0: src/LiveCoding/Preliminary/LiveProgram/LiveProgramPreliminary.lhs
\begin{figure}
\begin{comment}
\begin{code}
{-# LANGUAGE RecordWildCards #-}
module LiveCoding.Preliminary.LiveProgram.LiveProgramPreliminary where
-- base
import Control.Concurrent
import Control.Monad (forever)
\end{code}
\end{comment}
\begin{code}
data LiveProgram m s = LiveProgram
{ liveState :: s
, liveStep :: s -> m s
}
\end{code}
\begin{code}
stepProgram
:: Monad m
=> LiveProgram m s -> m (LiveProgram m s)
stepProgram liveProgram@LiveProgram { .. } = do
liveState' <- liveStep liveState
return liveProgram { liveState = liveState' }
\end{code}
\begin{code}
stepProgramMVar
:: MVar (LiveProgram IO s)
-> IO ()
stepProgramMVar var = do
currentProgram <- takeMVar var
nextProgram <- stepProgram currentProgram
putMVar var nextProgram
\end{code}
\begin{code}
launch
:: LiveProgram IO s
-> IO (MVar (LiveProgram IO s))
launch liveProgram = do
var <- newMVar liveProgram
forkIO $ forever $ stepProgramMVar var
return var
\end{code}
\caption{\texttt{LiveProgramPreliminary.lhs}}
\label{fig:LiveProgramPreliminary}
\end{figure}