hydra-0.15.0: src/main/haskell/Hydra/Demos/MeteredEvaluation.hs
-- | A small demo of "metered" Hydra evaluation. In this example, the evaluator keeps track of the number of times it
-- calls each primitive function (as a proxy for API calls, which can consume time and resources).
module Hydra.Demos.MeteredEvaluation (demoMeteredEvaluation) where
import Hydra.Kernel
import qualified Hydra.Show.Errors as ShowError
import Hydra.Dsl.Meta.Phantoms
import qualified Hydra.Dsl.Types as Types
import Hydra.Dsl.Meta.Lib.Lists as Lists
import Hydra.Dsl.Meta.Lib.Strings as Strings
import qualified Hydra.Encode.Core as EncodeCore
import qualified Hydra.Sources.Kernel.Terms.Show.Core as ShowCore
import Hydra.ExtGeneration
import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
import qualified Hydra.Dsl.Meta.Lib.Math as Math
import qualified Hydra.Dsl.Meta.Lib.Strings as Strings
import System.IO
import qualified Control.Monad as CM
import qualified Data.List as L
import qualified Data.Map as M
import qualified Data.Set as S
import Prelude hiding ((++))
testNs = Namespace "hydra.demos.meteredEvaluation"
testModule :: Module
testModule = Module {
moduleNamespace = testNs,
moduleDefinitions = definitions,
moduleTermDependencies = [],
moduleTypeDependencies = [],
moduleDescription = Nothing}
where
test local tterm = TTermDefinition (unqualifyName $ QualifiedName (Just testNs) local) tterm
definitions = [
toDefinition $ test "catStrings" (string "foo" ++ string "bar" ++ string "quux" ++ (Literals.showInt32 $ int32 42)),
toDefinition $ test "describeType" $ ShowCore.type_ @@ (TTerm $ EncodeCore.type_ $ Types.list $ Types.int32)]
demoMeteredEvaluation :: IO ()
demoMeteredEvaluation = do
case result of
Left err -> putStrLn $ "error: " <> ShowError.error err
Right reduced -> putStrLn $ "result: " <> show reduced
where
graph = modulesToGraph [testModule] [testModule]
cx = emptyContext
result = do
original <- bindingTerm <$> requireBinding graph (unqualifyName $ QualifiedName (Just testNs) "catStrings")
reduceTerm cx graph False original