Use fewer explicit TypeRep's
This commit is contained in:
parent
b23aa99b15
commit
d85243b1ba
|
@ -26,9 +26,8 @@ module DependencyGenerator
|
|||
) where
|
||||
|
||||
import Types.Token (Token(..))
|
||||
import Types.Value
|
||||
import Types.Functions (IsFunction(), IsFunctionIO(..))
|
||||
import Types.Dependency (Action(..), Dependency, makeDependency, unListType, unTupleType)
|
||||
import Types.Dependency (Action(..), Dependency, makeDependency)
|
||||
|
||||
import Type.Reflection (Typeable, TypeRep, typeRep)
|
||||
import Control.Monad.State (MonadState, State, runState, put, get)
|
||||
|
@ -67,7 +66,7 @@ genDependency :: (Typeable a, Show a) => (Token a -> Dependency) -> DepGenM (Tok
|
|||
genDependency f = genDependencyM (pure . f)
|
||||
|
||||
inject :: (Show a, Typeable a) => a -> DepGenM (Token a)
|
||||
inject x = genDependency (makeDependency NoToken (Inject (toValue x)))
|
||||
inject x = genDependency (makeDependency NoToken (Inject x))
|
||||
|
||||
runFunction :: IsFunction f a b => f -> Token a -> DepGenM (Token b)
|
||||
runFunction f input = genDependency (makeDependency input (Function f))
|
||||
|
@ -111,7 +110,7 @@ mapDepGenM f input = do
|
|||
outp <- f inp
|
||||
pure (inp, outp)
|
||||
put top'
|
||||
pure (makeDependency input' (MapComp typeRep typeRep subDeps innerInp innerOutp) target)
|
||||
pure (makeDependency input' (MapComp subDeps innerInp innerOutp) target)
|
||||
|
||||
mapDepGenM_ :: (TokenableTo [a] v, Typeable a, Show a) => (Token a -> DepGenM ()) -> v -> DepGenM ()
|
||||
mapDepGenM_ f input = do
|
||||
|
@ -127,7 +126,7 @@ forDepGenM_ = flip mapDepGenM_
|
|||
filterDepGenM' :: (TokenableTo [Bool] v, TokenableTo [a] u, Typeable a, Show a) => v -> u -> DepGenM (Token [a])
|
||||
filterDepGenM' mask input = do
|
||||
tup <- toTupleToken input mask
|
||||
genDependency (makeDependency tup (FilterComp (unListType (tokenTypeRep input))))
|
||||
genDependency (makeDependency tup FilterComp)
|
||||
|
||||
filterDepGenM :: (TokenableTo [a] v, Typeable a, Show a) => (Token a -> DepGenM (Token Bool)) -> v -> DepGenM (Token [a])
|
||||
filterDepGenM f input = do
|
||||
|
@ -147,9 +146,7 @@ untupleFstDepGenM t = do
|
|||
TupleToken a _ ->
|
||||
pure a
|
||||
Token _ ->
|
||||
let tr = tokenTypeRep t
|
||||
(ta, tb) = unTupleType tr
|
||||
in genDependency (makeDependency t' (UntupleFst ta tb))
|
||||
genDependency (makeDependency t' UntupleFst)
|
||||
|
||||
untupleSndDepGenM :: (TokenableTo (a, b) t, Typeable a, Show a, Typeable b, Show b) => t -> DepGenM (Token b)
|
||||
untupleSndDepGenM t = do
|
||||
|
@ -158,9 +155,7 @@ untupleSndDepGenM t = do
|
|||
TupleToken _ b ->
|
||||
pure b
|
||||
Token _ ->
|
||||
let tr = tokenTypeRep t
|
||||
(ta, tb) = unTupleType tr
|
||||
in genDependency (makeDependency t' (UntupleSnd ta tb))
|
||||
genDependency (makeDependency t' UntupleSnd)
|
||||
|
||||
untupleDepGenM :: (TokenableTo (a, b) t, Typeable a, Show a, Typeable b, Show b) => t -> DepGenM (Token a, Token b)
|
||||
untupleDepGenM t = do
|
||||
|
@ -176,9 +171,7 @@ unzipFstDepGenM t = do
|
|||
ZipToken a _ ->
|
||||
pure a
|
||||
_ ->
|
||||
let tr = tokenTypeRep t
|
||||
(ta, tb) = unTupleType $ unListType tr
|
||||
in genDependency (makeDependency t' (UnzipFst ta tb))
|
||||
genDependency (makeDependency t' UnzipFst)
|
||||
|
||||
unzipSndDepGenM :: (TokenableTo [(a, b)] t, Typeable a, Show a, Typeable b, Show b) => t -> DepGenM (Token [b])
|
||||
unzipSndDepGenM t = do
|
||||
|
@ -187,9 +180,7 @@ unzipSndDepGenM t = do
|
|||
ZipToken _ b ->
|
||||
pure b
|
||||
_ ->
|
||||
let tr = tokenTypeRep t
|
||||
(ta, tb) = unTupleType $ unListType tr
|
||||
in genDependency (makeDependency t' (UnzipSnd ta tb))
|
||||
genDependency (makeDependency t' UnzipSnd)
|
||||
|
||||
unzipDepGenM :: (TokenableTo [(a, b)] t, Typeable a, Show a, Typeable b, Show b) => t -> DepGenM (Token [a], Token [b])
|
||||
unzipDepGenM t = do
|
||||
|
|
|
@ -1,6 +1,4 @@
|
|||
{-# LANGUAGE MonoLocalBinds #-}
|
||||
{-# LANGUAGE TypeApplications #-}
|
||||
{-# LANGUAGE PatternSynonyms #-}
|
||||
module DependencyRunner
|
||||
( DepRunM
|
||||
, runDeps
|
||||
|
@ -12,7 +10,6 @@ import Types.Value
|
|||
import Types.Token
|
||||
import Types.Dependency
|
||||
|
||||
import Type.Reflection (Typeable, TypeRep, typeRep, pattern App)
|
||||
import Data.Map (Map)
|
||||
import qualified Data.Map as M
|
||||
import Control.Monad (void, forM)
|
||||
|
@ -52,7 +49,7 @@ runDep (Dependency _ a action _ b) =
|
|||
putStrLn "----------"
|
||||
pure result
|
||||
|
||||
getTokenValue :: (Typeable a, Show a) => Token a -> DepRunM Value
|
||||
getTokenValue :: Token a -> DepRunM Value
|
||||
getTokenValue token = case token of
|
||||
Token i -> do
|
||||
m <- get
|
||||
|
@ -80,36 +77,29 @@ putTokenValue t e = case t of
|
|||
_ ->
|
||||
error "unexpected"
|
||||
|
||||
tupApp :: TypeRep a -> TypeRep b -> TypeRep (a, b)
|
||||
tupApp ta tb = App (App (typeRep @(,)) ta) tb
|
||||
|
||||
listApp :: TypeRep a -> TypeRep [a]
|
||||
listApp ta = App (typeRep @[]) ta
|
||||
|
||||
runAction :: Action a b -> Value -> DepRunM Value
|
||||
runAction action input = case action of
|
||||
Function f ->
|
||||
pure $ toValue $ evalFunction f $ fromValue input
|
||||
InlineFunction ta tb (F f) ->
|
||||
pure $ toValueRep tb $ f $ fromValueRep ta input
|
||||
InlineFunction (F f) ->
|
||||
pure $ toValue $ f $ fromValue input
|
||||
FunctionIO f ->
|
||||
liftIO (toValue <$> evalFunctionIO f (fromValue input))
|
||||
Inject v ->
|
||||
pure v
|
||||
FilterComp t ->
|
||||
let tl = listApp t
|
||||
(vs, mask) = fromValueRep (tupApp tl (typeRep @[Bool])) input
|
||||
in pure $ toValueRep tl $ map fst $ filter snd $ zip vs mask
|
||||
UntupleFst ta tb ->
|
||||
pure $ toValueRep ta $ fst $ fromValueRep (tupApp ta tb) input
|
||||
UntupleSnd ta tb ->
|
||||
pure $ toValueRep tb $ snd $ fromValueRep (tupApp ta tb) input
|
||||
UnzipFst ta tb ->
|
||||
pure $ toValueRep (listApp ta) $ map fst $ fromValueRep (listApp (tupApp ta tb)) input
|
||||
UnzipSnd ta tb ->
|
||||
pure $ toValueRep (listApp tb) $ map snd $ fromValueRep (listApp (tupApp ta tb)) input
|
||||
MapComp ta tb subDeps innerInput innerOutput ->
|
||||
(toValueRep (listApp tb) <$>) $ forM (fromValueRep (listApp ta) input) $ \x -> do
|
||||
putTokenValue innerInput $ Evaluated $ toValueRep ta x
|
||||
Inject x ->
|
||||
pure $ toValue x
|
||||
FilterComp ->
|
||||
let (vs, mask) = fromValue input
|
||||
in pure $ toValueRep (actionTargetType action) $ map fst $ filter snd $ zip vs mask
|
||||
UntupleFst ->
|
||||
pure $ toValue $ fst $ fromValueRep (actionSourceType action) input
|
||||
UntupleSnd ->
|
||||
pure $ toValue $ snd $ fromValueRep (actionSourceType action) input
|
||||
UnzipFst ->
|
||||
pure $ toValue $ map fst $ fromValueRep (actionSourceType action) input
|
||||
UnzipSnd ->
|
||||
pure $ toValue $ map snd $ fromValueRep (actionSourceType action) input
|
||||
MapComp subDeps innerInput innerOutput ->
|
||||
(toValueRep (actionTargetType action) <$>) $ forM (fromValueRep (actionSourceType action) input) $ \x -> do
|
||||
putTokenValue innerInput $ Evaluated $ toValue x
|
||||
runDeps subDeps
|
||||
fromValueRep tb <$> getTokenValue innerOutput
|
||||
fromValue <$> getTokenValue innerOutput
|
||||
|
|
|
@ -4,14 +4,13 @@ module Types.Dependency
|
|||
, F(..)
|
||||
, Dependency(..)
|
||||
, makeDependency
|
||||
, unListType
|
||||
, unTupleType
|
||||
, actionSourceType
|
||||
, actionTargetType
|
||||
, actionTouchesFilesystem
|
||||
, formatDependencyTrees
|
||||
) where
|
||||
|
||||
import Types.Token (Token(..))
|
||||
import Types.Value (Value)
|
||||
import Types.Functions (IsFunction(), IsFunctionIO(..))
|
||||
|
||||
import Type.Reflection (Typeable, TypeRep, typeRep)
|
||||
|
@ -21,15 +20,15 @@ import qualified Data.Text as T
|
|||
|
||||
data Action a b where
|
||||
Function :: IsFunction f a b => f -> Action a b
|
||||
InlineFunction :: Show b => TypeRep a -> TypeRep b -> F a b -> Action a b
|
||||
InlineFunction :: (Typeable a, Typeable b, Show b) => F a b -> Action a b
|
||||
FunctionIO :: IsFunctionIO f a b => f -> Action a b
|
||||
Inject :: Value -> Action () a
|
||||
FilterComp :: Show a => TypeRep a -> Action ([a], [Bool]) [a]
|
||||
UntupleFst :: (Show a, Show b) => TypeRep a -> TypeRep b -> Action (a, b) a
|
||||
UntupleSnd :: (Show a, Show b) => TypeRep a -> TypeRep b -> Action (a, b) b
|
||||
UnzipFst :: (Show a, Show b) => TypeRep a -> TypeRep b -> Action [(a, b)] [a]
|
||||
UnzipSnd :: (Show a, Show b) => TypeRep a -> TypeRep b -> Action [(a, b)] [b]
|
||||
MapComp :: (Typeable a, Show a, Typeable b, Show b) => TypeRep a -> TypeRep b -> [Dependency] -> Token a -> Token b -> Action [a] [b]
|
||||
Inject :: (Typeable a, Show a) => a -> Action () a
|
||||
FilterComp :: (Typeable a, Show a) => Action ([a], [Bool]) [a]
|
||||
UntupleFst :: (Typeable a, Show a, Typeable b, Show b) => Action (a, b) a
|
||||
UntupleSnd :: (Typeable a, Show a, Typeable b, Show b) => Action (a, b) b
|
||||
UnzipFst :: (Typeable a, Show a, Typeable b, Show b) => Action [(a, b)] [a]
|
||||
UnzipSnd :: (Typeable a, Show a, Typeable b, Show b) => Action [(a, b)] [b]
|
||||
MapComp :: (Typeable a, Show a, Typeable b, Show b) => [Dependency] -> Token a -> Token b -> Action [a] [b]
|
||||
|
||||
deriving instance Show (Action a b)
|
||||
|
||||
|
@ -45,24 +44,24 @@ deriving instance Show Dependency
|
|||
makeDependency :: (Typeable a, Show a, Typeable b, Show b) => Token a -> Action a b -> Token b -> Dependency
|
||||
makeDependency a action b = Dependency typeRep a action typeRep b
|
||||
|
||||
unListType :: Typeable a => TypeRep [a] -> TypeRep a
|
||||
unListType _ = typeRep
|
||||
actionSourceType :: Typeable a => Action a b -> TypeRep a
|
||||
actionSourceType _ = typeRep
|
||||
|
||||
unTupleType :: (Typeable a, Typeable b) => TypeRep (a, b) -> (TypeRep a, TypeRep b)
|
||||
unTupleType _ = (typeRep, typeRep)
|
||||
actionTargetType :: Typeable b => Action a b -> TypeRep b
|
||||
actionTargetType _ = typeRep
|
||||
|
||||
actionTouchesFilesystem :: Action a b -> Bool
|
||||
actionTouchesFilesystem = \case
|
||||
Function _ -> False
|
||||
InlineFunction _ _ _ -> False
|
||||
InlineFunction _ -> False
|
||||
FunctionIO f -> functionIOTouchesFilesystem f
|
||||
Inject _ -> False
|
||||
FilterComp _ -> False
|
||||
UntupleFst _ _ -> False
|
||||
UntupleSnd _ _ -> False
|
||||
UnzipFst _ _ -> False
|
||||
UnzipSnd _ _ -> False
|
||||
MapComp _ _ subDeps _ _ -> any dependencyTouchesFilesystem subDeps
|
||||
FilterComp -> False
|
||||
UntupleFst -> False
|
||||
UntupleSnd -> False
|
||||
UnzipFst -> False
|
||||
UnzipSnd -> False
|
||||
MapComp subDeps _ _ -> any dependencyTouchesFilesystem subDeps
|
||||
where dependencyTouchesFilesystem (Dependency _ _ action _ _) =
|
||||
actionTouchesFilesystem action
|
||||
|
||||
|
@ -107,7 +106,7 @@ formatDependencyTrees = T.concat . (formatDependencyTrees' "")
|
|||
|
||||
formatAction :: Text -> Action a b -> [Text]
|
||||
formatAction indentation = \case
|
||||
MapComp _ _ subDeps innerInput innerOutput ->
|
||||
MapComp subDeps innerInput innerOutput ->
|
||||
concat [ [ "MapComp(" ]
|
||||
, formatToken innerInput
|
||||
, [ " -> " ]
|
||||
|
|
Loading…
Reference in New Issue