Use the table name as a base for a fresh identifier.
This commit is contained in:
parent
3f2f1fdea7
commit
3e242d7b03
@ -140,18 +140,10 @@ newtype Ident = I T.Text
|
|||||||
|
|
||||||
-- | List of identifiers already in use and supply of temporary
|
-- | List of identifiers already in use and supply of temporary
|
||||||
-- identifiers.
|
-- identifiers.
|
||||||
data IdentState = IdentState { inUse :: !(HS.HashSet T.Text)
|
newtype IdentState = IdentState { inUse :: HS.HashSet T.Text }
|
||||||
, fresh :: ![T.Text] }
|
|
||||||
|
|
||||||
initialIdentState :: IdentState
|
initialIdentState :: IdentState
|
||||||
initialIdentState = IdentState mempty idents
|
initialIdentState = IdentState mempty
|
||||||
where
|
|
||||||
idents =
|
|
||||||
let alpha = ['A'..'Z']
|
|
||||||
letters 1 = map return alpha
|
|
||||||
letters n = (:) <$> alpha <*> letters (n-1)
|
|
||||||
everything = concat (map letters [(1::Int)..])
|
|
||||||
in map T.pack everything
|
|
||||||
|
|
||||||
|
|
||||||
-- | Create a fresh 'Ident'. If possible, use the given
|
-- | Create a fresh 'Ident'. If possible, use the given
|
||||||
@ -159,20 +151,21 @@ initialIdentState = IdentState mempty idents
|
|||||||
newIdentFor :: DBName -> SqlQuery Ident
|
newIdentFor :: DBName -> SqlQuery Ident
|
||||||
newIdentFor = Q . lift . try . unDBName
|
newIdentFor = Q . lift . try . unDBName
|
||||||
where
|
where
|
||||||
try t = do
|
try orig = do
|
||||||
s <- S.get
|
s <- S.get
|
||||||
if t `HS.member` inUse s
|
let go (t:ts) | t `HS.member` inUse s = go ts
|
||||||
then newIdent
|
| otherwise = use t
|
||||||
else markAsUsed t >> return (I t)
|
go [] = error "Esqueleto/Sql/newIdentFor: never here"
|
||||||
|
go (possibilities orig)
|
||||||
|
|
||||||
newIdent = do
|
possibilities t = t : map addNum [2..]
|
||||||
s <- S.get
|
where
|
||||||
let (f:fs) = fresh s
|
addNum :: Int -> T.Text
|
||||||
S.put s { fresh = fs }
|
addNum = T.append t . T.pack . show
|
||||||
try f
|
|
||||||
|
|
||||||
markAsUsed t =
|
use t = do
|
||||||
S.modify (\s -> s { inUse = HS.insert t (inUse s) })
|
S.modify (\s -> s { inUse = HS.insert t (inUse s) })
|
||||||
|
return (I t)
|
||||||
|
|
||||||
|
|
||||||
-- | Use an identifier.
|
-- | Use an identifier.
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user