Introducing RIO, an experimental library for extensible restricted IO in
Haskell.
Selling features:
* Automatic permissions inference. If you define a function:
fun fd r = do { str <- hGetContents fd ; modifyRIORef r (+1) ; return str }
RIO can infer the requirements as part of the type signature:
fun :: (Elem (ReadHandle a) o, Elem (ReadRef b) o, Elem (WriteRef b) o,
Num c) => RHandle a -> RIORef b c -> RIO o String
* Recursive context aquisition. If we have:
foo ref1 = withContextRef $ \p ->
do ref2 <- newRIORef p (undefined :: Int)
-- do some stuff with ref1 and ref2
it works.
* Potential for region allocation.
When you use withContextRef, any variables allocated cannot be type-
correctly accessed after withContextRef returns. Hence, they can be
deallocated at that time.
It is possible to write a function withNewRef that allocates a
reference and does not grant the capability to allocate more in the
same context; this could be implemented using *stack* allocation.
* It is extremely extensible. It is possible to implement a new set
of restricted actions in a separate module with very little code.
See the file README.LONG for a detailed demonstration.
http://members.cox.net/stefanor/RIO-0.1.tar.gz