# Module Blit_intf

    module Blit_intf: sig .. end

Standard type for `blit` functions, and reusable code for validating `blit` arguments.

Standard type for `blit` functions, and reusable code for validating `blit` arguments.

    type ('src, 'dst) blit = src:'src -> src_pos:int -> dst:'dst -> dst_pos:int -> len:int -> unit

If `blit : (src, dst) blit`, then `blit ~src ~src_pos ~len ~dst ~dst_pos` blits `len` values from `src` starting at position `src_pos` to `dst` at position `dst_pos`. Furthermore, `blit` raises if `src_pos`, `len`, and `dst_pos` don't specify valid slices of `src` and `dst`.

    type ('src, 'dst) blito = src:'src ->
           ?src_pos:int -> ?src_len:int -> dst:'dst -> ?dst_pos:int -> unit -> unit

`blito` is like `blit`, except that the `src_pos`, `src_len`, and `dst_pos` are optional (hence the "o" in "blito"). Also, we use `src_len` rather than `len` as a reminder that if `src_len` isn't supplied, then the default is to take the slice running from `src_pos` to the end of `src`.

    type ('src, 'dst) sub = 'src -> pos:int -> len:int -> 'dst

If `sub : (src, dst) sub`, then `sub ~src ~pos ~len` returns a sequence of type `dst` containing `len` characters of `src` starting at `pos`.

`subo` is like `sub`, except `pos` and `len` are optional.

    type ('src, 'dst) subo = ?pos:int -> ?len:int -> 'src -> 'dst

    module type S = sig .. end

    module type S_permissions = sig .. end

    module type S1 = sig .. end

    module type S1_permissions = sig .. end

    module type S_distinct = sig .. end

Users of modules matching the blit signatures `S`, `S1`, and `S1_distinct` only need to understand the code above. The code below is only for those that need to implement modules that match those signatures.

    module type Elt = sig .. end

    module type Sequence = sig .. end

    module type Blit = sig .. end

Standard type for `blit` functions, and reusable code for validating `blit` arguments.
If `blit : (src, dst) blit`, then `blit ~src ~src_pos ~len ~dst ~dst_pos` blits `len` values from `src` starting at position `src_pos` to `dst` at position `dst_pos`. Furthermore, `blit` raises if `src_pos`, `len`, and `dst_pos` don't specify valid slices of `src` and `dst`.
`blito` is like `blit`, except that the `src_pos`, `src_len`, and `dst_pos` are optional (hence the "o" in "blito"). Also, we use `src_len` rather than `len` as a reminder that if `src_len` isn't supplied, then the default is to take the slice running from `src_pos` to the end of `src`.
default is `0`
default is `length src - src_pos`
default is `0`
If `sub : (src, dst) sub`, then `sub ~src ~pos ~len` returns a sequence of type `dst` containing `len` characters of `src` starting at `pos`.

`subo` is like `sub`, except `pos` and `len` are optional.
default is `0`
default is `length src - pos`
Users of modules matching the blit signatures `S`, `S1`, and `S1_distinct` only need to understand the code above. The code below is only for those that need to implement modules that match those signatures.
`of_bool` is used to generate two distinct values of type `t`, used in unit tests. It is required that `of_bool false <> of_bool true`.
There are various `Make*` functors that turn an `unsafe_blit` function into a `blit` function. The functors differ in whether the sequence type is monomorphic or polymorphic, and whether the src and dst types are distinct or are the same.

The blit functions make sure the slices are valid and then call `unsafe_blit`. They guarantee at a call `unsafe_blit ~src ~src_pos ~dst ~dst_pos ~len` that:

            len > 0
            && src_pos >= 0
            && src_pos + len <= get_src_len src
            && dst_pos >= 0
            && dst_pos + len <= get_dst_len dst

The `Make*` functors also automatically create unit tests.
`Make` is for blitting between two values of the same monomorphic type.
`Make_distinct` is for blitting between values of distinct monomorphic types.
`Make1` is for blitting between two values of the same polymorphic type.
`Make1` guarantees to only call `create_like ~len t` with `len > 0` if `length t > 0`.
`create`, `get`, and `set` are just used for unit tests. `z` is needed for `Flat_tuple_array`.