module Data.Spec.Extra
( addMissingIdentifiers )
where
import Data.List (nub, (\\))
import Data.OgmaSpec (ExternalVariableDef (..), InternalVariableDef (..),
Requirement (..), Spec (..))
addMissingIdentifiers :: (a -> [String]) -> Spec a -> Spec a
addMissingIdentifiers :: forall a. (a -> [String]) -> Spec a -> Spec a
addMissingIdentifiers a -> [String]
f Spec a
s = Spec a
s { externalVariables = vars' }
where
vars' :: [ExternalVariableDef]
vars' = Spec a -> [ExternalVariableDef]
forall a. Spec a -> [ExternalVariableDef]
externalVariables Spec a
s [ExternalVariableDef]
-> [ExternalVariableDef] -> [ExternalVariableDef]
forall a. [a] -> [a] -> [a]
++ [ExternalVariableDef]
newVars
newVars :: [ExternalVariableDef]
newVars = (String -> ExternalVariableDef)
-> [String] -> [ExternalVariableDef]
forall a b. (a -> b) -> [a] -> [b]
map (\String
n -> String -> String -> ExternalVariableDef
ExternalVariableDef String
n String
"") [String]
newVarNames
newVarNames :: [String]
newVarNames = [String]
identifiers [String] -> [String] -> [String]
forall a. Eq a => [a] -> [a] -> [a]
\\ [String]
existingNames
identifiers :: [String]
identifiers = [String] -> [String]
forall a. Eq a => [a] -> [a]
nub ([String] -> [String]) -> [String] -> [String]
forall a b. (a -> b) -> a -> b
$ (Requirement a -> [String]) -> [Requirement a] -> [String]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (a -> [String]
f (a -> [String])
-> (Requirement a -> a) -> Requirement a -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Requirement a -> a
forall a. Requirement a -> a
requirementExpr) (Spec a -> [Requirement a]
forall a. Spec a -> [Requirement a]
requirements Spec a
s)
existingNames :: [String]
existingNames = (ExternalVariableDef -> String)
-> [ExternalVariableDef] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map ExternalVariableDef -> String
externalVariableName (Spec a -> [ExternalVariableDef]
forall a. Spec a -> [ExternalVariableDef]
externalVariables Spec a
s)
[String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ (InternalVariableDef -> String)
-> [InternalVariableDef] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map InternalVariableDef -> String
internalVariableName (Spec a -> [InternalVariableDef]
forall a. Spec a -> [InternalVariableDef]
internalVariables Spec a
s)