duet-0.0.1: src/Duet/Supply.hs
{-# LANGUAGE Strict #-}
{-# LANGUAGE FlexibleContexts #-}
-- |
module Duet.Supply where
import Control.Monad.Catch
import Control.Monad.Supply
import Duet.Types
supplyValueName :: (MonadSupply Int m, Identifiable i, MonadThrow m) => i -> m Name
supplyValueName s = do
i <- supply
Identifier s' <- identifyValue s
return (ValueName i s')
supplyConstructorName :: (MonadSupply Int m) => Identifier -> m Name
supplyConstructorName (Identifier s) = do
i <- supply
return (ConstructorName i s)
supplyDictName :: (MonadSupply Int m) => String -> m Name
supplyDictName s = do
i <- supply
return (DictName i s)
supplyDictName' :: (MonadSupply Int m, MonadThrow m) => Identifier -> m Name
supplyDictName' s = do
i <- supply
Identifier s' <- identifyValue s
return (DictName i s')
supplyTypeName :: (MonadSupply Int m) => Identifier -> m Name
supplyTypeName (Identifier s) = do
i <- supply
return (TypeName i s)
supplyTypeVariableName :: (MonadSupply Int m) => Identifier -> m Name
supplyTypeVariableName (Identifier s) = do
i <- supply
return (TypeName i (s ++ show i))
supplyClassName :: (MonadSupply Int m) => Identifier -> m Name
supplyClassName (Identifier s) = do
i <- supply
return (ClassName i s)
supplyMethodName :: (MonadSupply Int m) => Identifier -> m Name
supplyMethodName (Identifier s) = do
i <- supply
return (MethodName i s)