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
-~----------~----~----~----~------~----~------~--~---

Reply via email to