packages feed

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}