Rename a DFA's and NFA's states

This commit is contained in:
Joscha 2019-10-26 15:24:36 +00:00
parent c44f4c090b
commit 34a3a2027c
4 changed files with 93 additions and 0 deletions

View file

@ -1,5 +1,15 @@
{-# LANGUAGE TupleSections #-}
module Rextra.Util
( connectedElements
-- * Renaming
, Rename
, doRename
, getName
, renameSet
, renameMap
, renameKeys
, renameValues
) where
import Control.Monad
@ -17,3 +27,30 @@ explore trans node = do
connectedElements :: (Ord n) => (n -> Set.Set n) -> Set.Set n -> Set.Set n
connectedElements trans startingNodes =
flip execState Set.empty . mapM (explore trans) $ Set.toList startingNodes
type Rename n = State (Int, Map.Map n Int)
doRename :: Rename n a -> a
doRename rename = evalState rename (0, Map.empty)
getName :: (Ord n) => n -> Rename n Int
getName thing = do
(i, names) <- get
case names Map.!? thing of
Just name -> pure name
Nothing -> i <$ put (i + 1, Map.insert thing i names)
renameSet :: (Ord v2) => (v1 -> Rename n v2) -> Set.Set v1 -> Rename n (Set.Set v2)
renameSet renameFunc s = Set.fromList <$> (mapM renameFunc $ Set.toList s)
renameMap :: (Ord k2)
=> ((k1, v1) -> Rename n (k2, v2))
-> Map.Map k1 v1
-> Rename n (Map.Map k2 v2)
renameMap f m = Map.fromList <$> (mapM f $ Map.assocs m)
renameKeys :: (Ord k2) => (k1 -> Rename n k2) -> Map.Map k1 v -> Rename n (Map.Map k2 v)
renameKeys f = renameMap (\(k, v) -> (,v) <$> f k)
renameValues :: (Ord k) => (v1 -> Rename n v2) -> Map.Map k v1 -> Rename n (Map.Map k v2)
renameValues f = renameMap (\(k, v) -> (k,) <$> f v)