Kind of make it work with pre-compilation
But very messy now.
This commit is contained in:
@@ -1,11 +1,8 @@
|
||||
{-# LANGUAGE GADTs #-}
|
||||
module ComputationM
|
||||
( ComputationM
|
||||
, Token
|
||||
, tupleTokens
|
||||
, zipTokens
|
||||
, evalComputationM
|
||||
, inject
|
||||
-- , inject'
|
||||
, mapComputationM
|
||||
, mapComputationM_
|
||||
, filterComputationM
|
||||
@@ -14,43 +11,11 @@ module ComputationM
|
||||
) where
|
||||
|
||||
import Types
|
||||
import Dependency
|
||||
|
||||
import Control.Monad.State
|
||||
import Control.Monad.Writer
|
||||
|
||||
data TypedRun a b where
|
||||
Function :: IsFunction f a b => f -> TypedRun a b
|
||||
FunctionIO :: IsFunctionIO f a b => f -> TypedRun a b
|
||||
Inject :: b -> TypedRun () b
|
||||
GetListElem :: TypedRun [b] b
|
||||
SetListElem :: TypedRun a [a]
|
||||
MapComp :: [DependencyUntyped] -> TypedRun [a] [b]
|
||||
FilterComp :: TypedRun ([a], [Bool]) [a]
|
||||
|
||||
deriving instance (Show a, Show b) => Show (TypedRun a b)
|
||||
|
||||
data Token a where
|
||||
Token :: Int -> Token a
|
||||
TupleToken :: Token a -> Token b -> Token (a, b)
|
||||
ZipToken :: Token [a] -> Token [b] -> Token [(a, b)]
|
||||
NoToken :: Token ()
|
||||
|
||||
deriving instance Show (Token a)
|
||||
|
||||
tupleTokens :: (Show a, Show b) => Token a -> Token b -> Token (a, b)
|
||||
tupleTokens = TupleToken
|
||||
|
||||
zipTokens :: (Show a, Show b) => Token [a] -> Token [b] -> Token [(a, b)]
|
||||
zipTokens = ZipToken
|
||||
|
||||
data Dependency a b = Dependency (Token a) (TypedRun a b) (Token b)
|
||||
deriving (Show)
|
||||
|
||||
data DependencyUntyped where
|
||||
DependencyUntyped :: Dependency a b -> String -> DependencyUntyped
|
||||
|
||||
instance Show DependencyUntyped where
|
||||
show (DependencyUntyped _ s) = s
|
||||
import Language.Haskell.TH.Syntax
|
||||
|
||||
newtype ComputationM' a = ComputationM { unComputationM :: WriterT [DependencyUntyped] (State Int) a }
|
||||
deriving (Functor, Applicative, Monad, MonadState Int, MonadWriter [DependencyUntyped])
|
||||
@@ -63,10 +28,10 @@ evalComputationM' top m = runState (execWriterT (unComputationM m)) top
|
||||
evalComputationM :: ComputationM () -> [DependencyUntyped]
|
||||
evalComputationM m = fst (evalComputationM' 0 m)
|
||||
|
||||
tellDep :: (Show a, Show b) => Dependency a b -> ComputationM' ()
|
||||
tellDep dep = tell [DependencyUntyped dep (show dep)] -- Call show for later debugging purposes
|
||||
tellDep :: (Show a, Show b, Lift a, Lift b) => Dependency a b -> ComputationM' ()
|
||||
tellDep dep = tell [makeUntyped dep]
|
||||
|
||||
genDependency' :: (Show u, Show a) => (Token a -> ComputationM' (Dependency u a)) -> ComputationM a
|
||||
genDependency' :: (Show u, Show a, Lift u, Lift a) => (Token a -> ComputationM' (Dependency u a)) -> ComputationM a
|
||||
genDependency' f = do
|
||||
top <- get
|
||||
let top' = top + 1
|
||||
@@ -76,27 +41,40 @@ genDependency' f = do
|
||||
tellDep result
|
||||
pure target
|
||||
|
||||
genDependency :: (Show u, Show a) => (Token a -> Dependency u a) -> ComputationM a
|
||||
genDependency :: (Show u, Show a, Lift u, Lift a) => (Token a -> Dependency u a) -> ComputationM a
|
||||
genDependency f = genDependency' (pure . f)
|
||||
|
||||
inject :: Show a => a -> ComputationM a
|
||||
inject x = genDependency (Dependency NoToken (Inject x))
|
||||
-- inject :: (Show a, Lift a) => a -> ComputationM a
|
||||
-- inject x = genDependency (Dependency NoToken (Inject x))
|
||||
|
||||
getListElem :: Show a => Token [a] -> ComputationM a
|
||||
inject :: (Show a, Lift a, Valuable a) => a -> ComputationM a
|
||||
inject x = genDependency (Dependency NoToken (Inject (toValue x)))
|
||||
|
||||
-- inject' :: ImageConversionSettings -> ComputationM ImageConversionSettings
|
||||
-- -- inject' x = genDependency (Dependency NoToken (InjectImageConversionSettings x))
|
||||
-- inject' x = genDependency (Dependency NoToken (Inject WImageConversionSettings x))
|
||||
|
||||
getListElem :: (Show a, Lift a) => Token [a] -> ComputationM a
|
||||
getListElem outer = genDependency (Dependency outer GetListElem)
|
||||
|
||||
setListElem :: Show a => Token a -> Token [a] -> ComputationM ()
|
||||
setListElem :: (Show a, Lift a) => Token a -> Token [a] -> ComputationM ()
|
||||
setListElem a outer = do
|
||||
tellDep (Dependency a SetListElem outer)
|
||||
pure NoToken
|
||||
|
||||
runFunction :: (Show a, Show b, IsFunction f a b) => f -> Token a -> ComputationM b
|
||||
-- runFunction :: (Show a, Show b, Lift a, Lift b, IsFunction f a b) => f -> Token a -> ComputationM b
|
||||
-- runFunction f input = genDependency (Dependency input (Function f))
|
||||
|
||||
-- runFunctionIO :: (Show a, Show b, Lift a, Lift b, IsFunctionIO f a b) => f -> Token a -> ComputationM b
|
||||
-- runFunctionIO f input = genDependency (Dependency input (FunctionIO f))
|
||||
|
||||
runFunction :: (Show a, Show b, Lift a, Lift b) => Function -> Token a -> ComputationM b
|
||||
runFunction f input = genDependency (Dependency input (Function f))
|
||||
|
||||
runFunctionIO :: (Show a, Show b, IsFunctionIO f a b) => f -> Token a -> ComputationM b
|
||||
runFunctionIO :: (Show a, Show b, Lift a, Lift b) => FunctionIO -> Token a -> ComputationM b
|
||||
runFunctionIO f input = genDependency (Dependency input (FunctionIO f))
|
||||
|
||||
mapComputationM :: (Show a, Show b) => (Token a -> ComputationM b) -> Token [a] -> ComputationM [b]
|
||||
mapComputationM :: (Show a, Show b, Lift a, Lift b) => (Token a -> ComputationM b) -> Token [a] -> ComputationM [b]
|
||||
mapComputationM f input = genDependency' $ \target -> do
|
||||
top <- get
|
||||
let (res, top') = evalComputationM' top $ do
|
||||
@@ -106,12 +84,12 @@ mapComputationM f input = genDependency' $ \target -> do
|
||||
put top'
|
||||
pure (Dependency input (MapComp res) target)
|
||||
|
||||
mapComputationM_ :: Show a => (Token a -> ComputationM ()) -> Token [a] -> ComputationM ()
|
||||
mapComputationM_ :: (Show a, Lift a) => (Token a -> ComputationM ()) -> Token [a] -> ComputationM ()
|
||||
mapComputationM_ f input = do
|
||||
_ <- mapComputationM f input
|
||||
pure NoToken
|
||||
|
||||
filterComputationM :: Show a => (Token a -> ComputationM Bool) -> Token [a] -> ComputationM [a]
|
||||
filterComputationM :: (Show a, Lift a) => (Token a -> ComputationM Bool) -> Token [a] -> ComputationM [a]
|
||||
filterComputationM f input = do
|
||||
conds <- mapComputationM f input
|
||||
genDependency (Dependency (TupleToken input conds) FilterComp)
|
||||
|
||||
Reference in New Issue
Block a user