On Mon, Aug 9, 2010 at 9:56 PM, Gregory Collins <greg@gregorycollins.net> wrote:
Jeremy Shaw <jeremy@n-heptane.com> writes:

> Nice!
>
> I have not had time to look at this in detail, and probably won't for a few
> more days. But I am certainly in favor of the concept.
>
> I recently wrote some code for one of my own projects to deal with creating
> query string key/value pairs. It will be interesting to see  how they overlap.
>
> - jeremy
>
> p.s. Also, the query string is not required to be key/value pairs. It can be
> any non-hierarchical data which, combined with the path info,  serves to
> identify a resource. It just happens the key/value pairs are  the single most
> common what of encoding the this data. If web-routes  is going to only support
> key/value pairs, that is fine. But we should  probably acknowledge that in the
> docs.

Should the type of the query string part should be "[(String,[String])]"
instead of "[(String, String)]"? I guess it depends on whether you
wanted "/?foo=a&foo=b&foo=c" to decode the query params as:

   [("foo","a"), ("foo","b"), ("foo","c")]

vs

   [("foo", ["a", "b", "c"])]

The latter has the advantage that "lookup" returns all of the values at
once. Would "Map String [String]" be better?

I know that in practice we usually ignore the order of the keys, but in theory that information could be useful. Also, I think that the [(String, String)] is the most useful structure; if you want to get all the values, just use a "filter (\x -> snd x == key)", and then the usual case of looking up a single value is simple.

However, the most important issue is that the key/value pairs being constructed here aren't actually being looked up in; it will almost exclusively be used for constructing a URL, in which case this is the simplest approach programatically. We also need to append lists, and having the data type be [(String, [String])] would introduce a lot of overhead of ensuring keys aren't duplicated.

Michael