packages feed

lambda-calculator-3.1.0.0: src/Language/Lambda/Shared/UniqueSupply.hs

module Language.Lambda.Shared.UniqueSupply where

import Language.Lambda.Shared.Errors (LambdaException(..))

import Control.Monad.Except (MonadError(..), throwError)
import RIO
import RIO.List (find)
import RIO.Text (pack, toUpper)

type Unique = Text

defaultUniques :: [Unique]
defaultUniques = map pack strings
  where strings = concatMap (\p -> map (:p) . reverse $ ['a'..'z']) suffix
        suffix = "" : map show [(0::Int)..]

defaultTyUniques :: [Unique]
defaultTyUniques = map toUpper defaultUniques

next
  :: (Ord name, MonadError LambdaException m)
  => [name] -- ^ Unique supply
  -> [name] -- ^ Free Variables
  -> m name
next freeVars uniques' = case find (`notElem` freeVars) uniques' of
  Just unique -> pure unique
  Nothing -> throwError ImpossibleError