35 lines
859 B
Haskell
35 lines
859 B
Haskell
{-# LANGUAGE BlockArguments #-}
|
|
{-# LANGUAGE TypeFamilies #-}
|
|
module Gyehoek.GenSym where
|
|
|
|
import Numeric.Natural
|
|
import Effectful.State.Dynamic
|
|
import Effectful.Dispatch.Dynamic
|
|
import Effectful
|
|
import Language.QBE as QBE
|
|
import Data.String (IsString(fromString))
|
|
import Data.Text (Text)
|
|
|
|
|
|
class Gen a where
|
|
gen :: Natural -> a
|
|
|
|
data GenSym :: Effect where
|
|
GenSym :: Gen a => GenSym m a
|
|
|
|
type instance DispatchOf GenSym = Dynamic
|
|
|
|
gensym :: forall a es. (Gen a, GenSym :> es) => Eff es a
|
|
gensym = send GenSym
|
|
|
|
runGenSym :: Eff (GenSym : es) a -> Eff es a
|
|
runGenSym = reinterpret (evalStateLocal (0 :: Natural)) \_ GenSym ->
|
|
state \n -> (gen n, succ n)
|
|
-- state \n -> (Ident . fromString $ '.' : show n, succ n)
|
|
|
|
instance Gen (QBE.Ident s) where
|
|
gen = Ident . fromString . ('.':) . show
|
|
|
|
instance Gen Text where
|
|
gen = fromString . ('x':) . show
|