-
Notifications
You must be signed in to change notification settings - Fork 28
Referential Transparency
Webmachine goes to great lengths to help your [[resource
functions|Resource Functions]] be as referentially transparent
as possible. By "referentially transparent" we mean that given the
same input {ReqData, Context}
the function will return the same
output {Result, ReqData, Context}
and that side effects will be
insignificant from the point of view of Webmachine's execution.
Since resource functions are generally referentially transparent, many things are easier -- testing, debugging, and even static analysis and reasoning about your web application.
We don't try to force you into pure referential transparency; we give
you as big a hole as you want via Context
. As that term is
application-specific, you can put database handles, server process
identifiers, or anything else you like in there and we won't try to
stop you.
The streamed body feature exists to allow
resources to consume or produce request/response bodies a hunk at a
time without ever having the whole thing in memory. While the
continuation-passing style used in the streaming API is friendly to
general functional analysis, due to the necessary side-effect of
reading or writing to sockets the stream bodies cannot be treated in
quite the same way as other uses of the ReqData
interface. Luckily,
it is easy to inspect a ReqData
to see if this is the case in any
individual resource or request instance.