Concurrent Clean : MySQL binding

ここのところ作業していたMySQL bindingが一応使えるようになった。Blobとか、各種オプションとかはサポートしていないので、基本的なところしか使えないが。
サンプルプログラムはこんな感じ。

module Main

import MySQL, StdDebug

Start w # (mConn,w) = MySQLOpen host port db user pass [] w
        = case mConn of
            Fail e = trace_n e w
            Pass conn
              # (mStmt,conn) = sqlOpenStatement sql [] conn
                conn = case mStmt of
                         Fail e = trace_n e conn
                         Pass stmt
                           # stmt = run stmt
                             (mErr,conn) = sqlCloseStatement stmt conn
                           = case mErr of
                               Nothing = conn
                               Just e  = trace_n e conn
                (mErr,w) = sqlClose conn w
              = case mErr of
                  Nothing = w
                  Just e  = trace_n e w
  where
    host = "localhost"
    port = 0
    db   = "cleanoptenv"
    user = "lethevert"
    pass = "lethevert"
    sql = "SELECT * FROM TBL1 WHERE STR = ? AND NUM = ?"
    run stmt
        # (mErr,stmt) = sqlBind [SQL_TEXT "Hello", SQL_INT 1] stmt
        = case mErr of
            Just e = trace_n e stmt
            Nothing
              # (mErr,stmt) = sqlQuery stmt
              = case mErr of
                  Just e = trace_n e stmt
                  Nothing
                    # (cols,stmt) = sqlColumns stmt
                      stmt = showCols (size cols) cols stmt
                    = each stmt
    showCols :: !Int !{!String} !*MySQLStmt -> *MySQLStmt
    showCols 0 cols stmt = stmt
    showCols idx cols stmt = let nidx = dec idx
                             in showCols nidx cols (trace_n cols.[nidx] stmt)
    each :: !*MySQLStmt -> *MySQLStmt
    each stmt
        # (mNext,stmt) = sqlFetch stmt
        = case mNext of
            Fail e = trace_n e stmt
            Pass False = stmt
            Pass True # (mData,stmt) = sqlResults stmt
                      = case mData of
                          Fail e = trace_n e stmt
                          Pass data # stmt = showResults (size data) data stmt
                                    = each stmt
    showResults 0 data stmt = stmt
    showResults idx data stmt = let nidx = dec idx
                                in showResults nidx data (trace_n data.[nidx] stmt)