module Debug.Hoed.Pure
(
observe
, observeBase
, observeOpaque
, constrainBase
, send
, runO
, printO
, Observable(..)
, Observer(..)
, (<<)
, Generic
) where
import Control.Monad
import Data.Functor.Identity
import GHC.Generics
observe :: String -> a -> a
observe _ x = x
runO :: IO a -> IO ()
runO = void
printO :: (Show a) => a -> IO ()
printO expr = runO (print expr)
infixl 9 <<
class Observable a where
observer :: a -> b -> a
observer a _ = a
constrain :: a -> a -> a
constrain a b = a
instance Observable a
newtype Observer = O (forall a . (Observable a) => String -> a -> a)
newtype ObserverM a = ObserverM { runMO :: Identity a}
deriving (Functor, Applicative, Monad)
(<<) :: (Observable a) => ObserverM (a -> b) -> a -> ObserverM b
fn << a = fn <*> pure a
observeBase :: a -> parent -> a
observeBase = const
constrainBase :: a -> a -> a
constrainBase = const
observeOpaque :: String -> a -> parent -> a
observeOpaque _ val _ = val
send :: String -> ObserverM a -> parent -> a
send _ a _ = runIdentity $ runMO a