| | 177 | |
| | 178 | == General deficiencies == |
| | 179 | * Routing is untyped (stringly typed), a common but unfortunate situation for most routing libraries which vanilla Happstack manages to avoid. This is a necessary evil when Haskell lacks inclusion polymorphism and subtyping (e.g. the Restlet approach [http://www.restlet.org/documentation/1.1/tutorial#part11 hides some of the complexity] with subclasses), but combinator functions can help alleviate it. For example, withPackageName converts a list of string path components into a !PackageName, and other variants of with* functions do data querying as well. |
| | 180 | * Server-side and client-side caching is only ad-hoc presently. |
| | 181 | * grep -R 'TODO\|FIXME' . —and expect a screenful or two |
| | 182 | * User groups have a messy interface. Although each feature should define and manage their own, it is still desirable to map a user to the groups they are in. Presently this is done by mapping a !UserId to a bunch of URIs, and each URI to a group description. |
| | 183 | * Too many cross-cutting Happstack queries. Features should hide Happstack queries and updates in their own wrappers, which may also call hooks and do any related maintenance. |
| | 184 | * The system of relying on hooks and filters to keep features in sync is fragile, and it's easy to miss something and get inconsistent results. Perhaps there should be a package mapping which has the express purpose of syncing with the main index. |
| | 185 | * As ever, eliminate as much boilerplate as sanely possible. |