 See https://www.sqlite.org/lang_expr.html#varparam for more information.
 */
 public struct Bindings {
-    let impl: BindingsImpl
-    
-    // Bindings([SQLiteValueConvertible?])
-    //
-    // Supported usage:
-    //
-    //     db.execute("INSERT ... (?,?,?)",
-    //                bindings: Bindings(rowModel.databaseDictionary.values))
-    public init<Sequence: SequenceType where Sequence.Generator.Element == Optional<SQLiteValueConvertible>>(_ array: Sequence) {
-        impl = BindingsArrayImpl(array: Array(array))
-    }
-    
-    // Bindings([SQLiteValueConvertible])
-    //
-    // No known usage yet.
-    public init<Sequence: SequenceType where Sequence.Generator.Element == SQLiteValueConvertible>(_ array: Sequence) {
-        impl = BindingsArrayImpl(array: array.map { $0 })
-    }
-    
-    // Bindings(NSArray)
-    //
-    // This is a convenience initializer.
-    //
-    // Without it, the following code won't compile:
-    //
-    //    let statement = try db.updateStatement("INSERT INTO persons (name, age) VALUES (?, ?)")
-    //    let persons = [
-    //        ["Arthur", 41],
-    //        ["Barbara"],
-    //    ]
-    //    for person in persons {
-    //        statement.clearBindings()
-    //        statement.bind(Bindings(person))  // Error
-    //        try statement.execute()
-    //    }
+    
+    // MARK: - Positional SQLite parameters
+    
+    /**
+    Initializes bindings from a sequence of optional values.
+    
+        let values: [String?] = ["foo", "bar", nil]
+        db.execute("INSERT ... (?,?,?)", bindings: Bindings(values))
+    
+    - parameter sequence: A sequence of optional values that adopt the
+                          SQLiteValueConvertible protocol.
+    - returns: A Bindings.
+    */
+    public init<Sequence: SequenceType where Sequence.Generator.Element == Optional<SQLiteValueConvertible>>(_ sequence: Sequence) {
+        impl = BindingsArrayImpl(array: Array(sequence))
+    }
+    
+    /**
+    Initializes bindings from a sequence of values.
+    
+        let values: [String] = ["foo", "bar", "baz"]
+        db.execute("INSERT ... (?,?,?)", bindings: Bindings(values))
+    
+    - parameter sequence: A sequence of values that adopt the
+                          SQLiteValueConvertible protocol.
+    - returns: A Bindings.
+    */
+    public init<Sequence: SequenceType where Sequence.Generator.Element == SQLiteValueConvertible>(_ sequence: Sequence) {
+        impl = BindingsArrayImpl(array: sequence.map { $0 })
+    }
+    
+    /**
+    Initializes bindings from an NSArray.
+    
+    The array must contain objects that adopt the SQLiteValueConvertible
+    protocol, NSNull, NSNumber or NSString. A fatal error is thrown otherwise.
+    
+        let values: NSArray = ["foo", "bar", "baz"]
+        db.execute("INSERT ... (?,?,?)", bindings: Bindings(values))
+    
+    - parameter array: An NSArray
+    - returns: A Bindings.
+    */
     public init(_ array: NSArray) {
+        // IMPLEMENTATION NOTE
+        //
+        // This initializer is required for the following code to compile:
+        //
+        //    let statement = try db.updateStatement("INSERT INTO persons (name, age) VALUES (?, ?)")
+        //    let persons = [   // NSArray of NSArray, actually
+        //        ["Arthur", 41],
+        //        ["Barbara"],
+        //    ]
+        //    for person in persons {
+        //        try statement.execute(Bindings(person))   // Avoid an error here
+        //    }
         var values = [SQLiteValueConvertible?]()
         for item in array {
             values.append(Bindings.valueFromAnyObject(item))

        self.init(values)
    }
    
    // Bindings([String: SQLiteValueConvertible?])
    //
    // Supported usage: DictionaryLiteralConvertible adoption:
    //
    //     db.execute("INSERT ... (:name, :age)",
    //                bindings: ["name"; "Arthur", "age": 41])
    public init(_ dictionary: [String: SQLiteValueConvertible?]) {
        impl = BindingsDictionaryImpl(dictionary: dictionary)
    }
    
    // Bindings(NSDictionary)
    //
    // This is a convenience initializer.
    //
    // Without it, the following code won't compile:
    //
    //    let statement = try db.updateStatement("INSERT INTO persons (name, age) VALUES (:name, :age)")
    //    let persons = [
    //        ["name": "Arthur", "age": 41],
    //        ["name": "Barbara"],
    //    ]
    //    for person in persons {
    //        statement.clearBindings()
    //        statement.bind(Bindings(person))  // Error
    //        try statement.execute()
    //    }
    public init(_ dictionary: NSDictionary) {
        var values = [String: SQLiteValueConvertible?]()
        for (key, item) in dictionary {
            if let key = key as? String {

// THE SOFTWARE.


/**
Bindings hold values for SQLite parameters:

