Hi,
I am building a web app which has a rest API. I found that I was
repeating myself like this:
val reply:Full[XmlResponse] = req.xml match {
case Full(content) => {
a block of code that does something with the content
<ok/>
}
case _ => <fail/>
}
So I first though I would create a function to help a little:
private def handle[T](b:Box[T])(block:T => Unit):Full[XmlResponse] =
b match {
case Full(x) => {
block(x)
<ok/>
}
case _ => <fail/>
}
which reduces the example to:
val reply:Full[XmlResponse] = handle(req.xml) { content:Elem =>
do something with content
}
ok so far so good (I think? Is It?)
But, being REST, the url is pointing at a resource which gets loaded
as a Box, so the above will not work so nicely. We are back to:
val reply:Full[XmlResponse] = req.xml match {
case Full(content) => {
MappedThing.find( By content attributes ) match {
case Full(obj) => {
doSomething
<ok/>
}
case _ => <fail/>
}
}
case _ => <fail/>
}
nasty.
So I was now thinking that I need a crazy function whose signature is
something like this:
def crazy[X, T](a:Box[X])(block1:X => Box[T])(block2:T => Unit):Full
[XmlResponse]
and used something like this:
crazy(req.xml) (content:Elem => MappedThing.find...) {obj:MappedThing
=>
...
}
Does any of this makes any sense? Is this just wrong?
Also, as an exercise, I wondered if there was a type-safe way to
generalise this concept so that a chain of functions could be supplied
which took an initial Box (or Option) and applied each function to the
result of the previous function to obtain a final result?
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Lift" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/liftweb?hl=en
-~----------~----~----~----~------~----~------~--~---