on 8d7c121 help sign in
elk/src/Optimize/Environment.hs
78 lines 1.4 kB history raw
1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE OverloadedStrings #-}
3module Optimize.Environment
4 ( Optimizer, run
5 , Env
6 , getVariantDict
7 , getHome
8 , getTailCall, setTailCall
9 , freshName
10 )
11 where
13import qualified Control.Monad.State as State
14import Data.Monoid ((<>))
15import Data.Text (Text)
16import qualified Data.Text as Text
18import qualified AST.Module.Name as ModuleName
19import qualified Optimize.DecisionTree as DT
23-- ENVIRONMENT
26data Env =
27 Env
28 { _hasTailCall :: Bool
29 , _uid :: Int
30 , _variantDict :: DT.VariantDict
31 , _home :: ModuleName.Canonical
32 }
36-- OPTIMIZER
39type Optimizer a =
40 State.State Env a
43run :: DT.VariantDict -> ModuleName.Canonical -> Optimizer a -> a
44run variantDict home optimizer =
45 State.evalState optimizer (Env False 0 variantDict home)
49-- HELPERS
52getVariantDict :: Optimizer DT.VariantDict
53getVariantDict =
54 State.gets _variantDict
57getHome :: Optimizer ModuleName.Canonical
58getHome =
59 State.gets _home
62getTailCall :: Optimizer Bool
63getTailCall =
64 State.gets _hasTailCall
67setTailCall :: Bool -> Optimizer ()
68setTailCall bool =
69 do env <- State.get
70 State.put (env { _hasTailCall = bool })
73freshName :: Optimizer Text
74freshName =
75 do (Env htc uid vd home) <- State.get
76 State.put (Env htc (uid + 1) vd home)
77 return ("_p" <> Text.pack (show uid))