"key[subkey][subsubkey]" => "some_value"
is parsed into {"key" => {"subkey" => {"subsubkey" => "some_value"}}}
for any depth of nesting.Valid keys would be:
"key"
"key[subkey]"
"key[subkey][subsubkey]"
etc.
I hope I got the spec right. Pretty tired right now, been coding all day. :) let Right x = paramTree [("a[x]","b"),("a[b]","c"),
("a[b][c]","d"),("bc[de]","f")] in putStrLn (drawTree x)
{ "a" => { "b" => <conflict>, "x" => "b" }, "bc" => {
"de" => "f" } }yc.hs:35:34: No instance for (Monad (Either String)) arising from a use of `mapM' at yc.hs:35:34-52 Possible fix: add an instance declaration for (Monad (Either String)) In a 'do' expression: keys <- mapM parseKey names In the expression: do keys <- mapM parseKey names return (toTree (zip keys values)) In the definition of `paramTree': paramTree nameValues = do keys <- mapM parseKey names return (toTree (zip keys values)) where (names, values) = unzip nameValues
(Edit: I'm sorry that the error message's whitespace gets messed up here.)
Also your groupings function is only used in conjunction with Data.Map.fromList. Did you consider using something like Data.Map.fromListWith (++) instead? Of course you'd have to wrap your would-be Map values in singleton lists first.
instance Error e => Monad (Either e) where
...
I didn't consider Data.Map.fromListWith; I didn't know about it. (Thanks.)$parsed = str_replace('{', '{"', '{'.str_replace(Array('[', ']'), Array('" => {', ''), $string)) .str_repeat('}', substr_count($string, '[')+1);