{-# LANGUAGE Safe #-}
{-# LANGUAGE FlexibleInstances, FlexibleContexts #-}
module Cryptol.TypeCheck.PP
( NameMap, WithNames(..)
, emptyNameMap
, ppWithNamesPrec, ppWithNames
, nameList
, dump
, module Cryptol.Utils.PP
) where
import Data.IntMap (IntMap)
import qualified Data.IntMap as IntMap
import Data.List(transpose)
import Cryptol.Utils.PP
type NameMap = IntMap String
emptyNameMap :: NameMap
emptyNameMap :: NameMap
emptyNameMap = forall a. IntMap a
IntMap.empty
data WithNames a = WithNames a NameMap
ppWithNamesPrec :: PP (WithNames a) => NameMap -> Int -> a -> Doc
ppWithNamesPrec :: forall a. PP (WithNames a) => NameMap -> Int -> a -> Doc
ppWithNamesPrec NameMap
names Int
prec a
t = forall a. PP a => Int -> a -> Doc
ppPrec Int
prec (forall a. a -> NameMap -> WithNames a
WithNames a
t NameMap
names)
ppWithNames :: PP (WithNames a) => NameMap -> a -> Doc
ppWithNames :: forall a. PP (WithNames a) => NameMap -> a -> Doc
ppWithNames NameMap
names a
t = forall a. PP (WithNames a) => NameMap -> Int -> a -> Doc
ppWithNamesPrec NameMap
names Int
0 a
t
dump :: PP (WithNames a) => a -> String
dump :: forall a. PP (WithNames a) => a -> String
dump a
x = forall a. Show a => a -> String
show (forall a. PP (WithNames a) => NameMap -> a -> Doc
ppWithNames forall a. IntMap a
IntMap.empty a
x)
nameVariant :: Int -> String -> String
nameVariant :: Int -> String -> String
nameVariant Int
0 String
x = String
x
nameVariant Int
n String
x = String
x forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Int
n
nameVariants :: String -> [String]
nameVariants :: String -> [String]
nameVariants String
x = forall a b. (a -> b) -> [a] -> [b]
map (Int -> String -> String
`nameVariant` String
x) [ Int
0 .. ]
nameList :: [String] -> [String]
nameList :: [String] -> [String]
nameList [String]
names = forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat forall a b. (a -> b) -> a -> b
$ forall a. [[a]] -> [[a]]
transpose forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map String -> [String]
nameVariants [String]
baseNames
where
baseNames :: [String]
baseNames | forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
names = forall a b. (a -> b) -> [a] -> [b]
map (forall a. a -> [a] -> [a]
:[]) [ Char
'a' .. Char
'z' ]
| Bool
otherwise = [String]
names