Hi,

Am Donnerstag, den 03.07.2008, 15:55 +0200 schrieb Joachim Breitner:
> I have some code that I’ll put somewhere soon.

http://darcs.nomeata.de/odio/ODIO.hs now contains a simple
implementation of the idea, together with more explanation. To show what
the effect is, I wrote a very small program:

1> main = runODIO $ do
2>      c1 <- readFileOD' "inFile1"
3>      c2 <- readFileOD' "inFile2"
4>      c3 <- readFileOD' "inFile3"
5>      liftIO $ putStrLn "Some output"
6>      writeFileOD' "outFile1" (show (length c1 + length c2))
7>      c4 <- readFileOD' "inFile4"
8>      writeFileOD' "outFile2" (show (length c1 + length c3 + length c4))
9>      time <- liftIO $ getClockTime
A>      writeFileOD' "outFile3" (show time ++ c1)

and a script that runs this under various conditions
http://darcs.nomeata.de/odio/demo.sh with the output available at
http://darcs.nomeata.de/odio/demo.out. Note that the primes after the
function calls are just for the verbose variant for demonstration.

Some points to emphasize (you can verify them in the demo output).

 * The 9th line runs an arbitary IO action, so from then on, ODIO can’t
do anything else but to actually write out every file it should.

 * The 5th line does not have this effect. Because this gets desugared
to (>>), the special implementation of (>>) means that the next line
still sees the same dependency state as the before the call to liftIO.

 * A change to inFile3 causes outFile1 to be re-written, although from
looking at the code, _we_ know that this is not necessary, but the ODIO
monad can not tell. The programmer should have swapped the lines.

 * A change only to inFile4 means that outFile1 will not have to
generated, and thanks to lazyness and unsafeInterleaveIO, inFile2 will
not even opened.


Some additions that might be necessary for real world use:
 * ByteString interface
 * a variant of readFileOD with type “FilePath -> IO a -> ODIO a”
if, instead of reading the file directly, you want to call some external
parsing helper (e.g. to read exif data).
 * A even more verbose mode that tells you why exactly a write action
has to be done. This is why I keep a list of Files and Timestamps
around.


I hope this is a basis for even more discussion, and of course
http://darcs.nomeata.de/odio/ is a darcs repository, so feel free to
send patches.

Greetings,
Joachim

-- 
Joachim "nomeata" Breitner
  mail: [EMAIL PROTECTED] | ICQ# 74513189 | GPG-Key: 4743206C
  JID: [EMAIL PROTECTED] | http://www.joachim-breitner.de/
  Debian Developer: [EMAIL PROTECTED]

Attachment: signature.asc
Description: Dies ist ein digital signierter Nachrichtenteil

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to