Jump to content

Update a configuration file: Difference between revisions

→‎{{header|Haskell}}: Added Haskell solution
No edit summary
(→‎{{header|Haskell}}: Added Haskell solution)
Line 852:
c.Write(os.Stdout)
}</lang>
 
=={{header|Haskell}}==
 
Definition of datatypes:
 
<lang Haskell>data INI = INI { entries :: [Entry] } deriving Show
 
data Entry = Comment String
| Field String String
| Flag String Bool
| EmptyLine
 
instance Show Entry where
show entry = case entry of
Comment text -> "# " ++ text
Field f v -> f ++ " " ++ v
Flag f True -> f
Flag f false -> "; " ++ f
EmptyLine -> ""
 
instance Read Entry where
readsPrec _ s = [(interprete s, "")]
where
interprete ('#' : text) = Comment text
interprete entry = case words entry of
[] -> EmptyLine
";" : field -> Flag (toUpper <$> unwords field) False
[field] -> Flag (toUpper <$> field) True
field : value -> Field (toUpper <$> field) (unwords value)</lang>
 
Getting and setting fields in INI data:
 
<lang Haskell>fieldIs f entry = (toUpper <$> f) == (toUpper <$> field entry)
where
field (Field f _) = f
field (Flag f _) = f
field _ = ""
 
splitOn f entries = case break (fieldIs f) entries of
(lst, []) -> (lst, [])
(lst, _:post) -> (lst, post)
 
getValue :: String -> INI -> Maybe String
getValue f ini = find (fieldIs f) (entries ini) >>= value
where value (Field _ v) = Just v
value _ = Nothing
 
getFlag :: String -> INI -> Maybe Bool
getFlag f ini = find (fieldIs f) (entries ini) >>= value
where value (Flag _ v) = Just v
value _ = Nothing
 
setValue :: String -> String -> INI -> INI
setValue f v ini = ini {entries = prev ++ [Field f v] ++ post}
where (prev,post) = splitOn f (entries ini)
 
setFlag :: String -> Bool -> INI -> INI
setFlag f v ini = ini {entries = prev ++ [Flag f v] ++ post}
where (prev,post) = splitOn f (entries ini)
 
enable f = setFlag f True
disable f = setFlag f False</lang>
 
IO stuff:
 
<lang Haskell>readIni :: String -> IO INI
readIni file = INI . map read . lines <$> S.readFile file
 
writeIni :: String -> INI -> IO ()
writeIni file = writeFile file . unlines . map show . entries
 
updateIni :: String -> (INI -> INI) -> IO ()
updateIni file f = readIni file >>= writeIni file . f
 
main = updateIni "test.ini" $
disable "NeedsPeeling" .
enable "SeedsRemoved" .
setValue "NumberOfBananas" "1024" .
setValue "NumberOfStrawberries" "62000"</lang>
 
=={{header|J}}==
Anonymous user
Cookies help us deliver our services. By using our services, you agree to our use of cookies.