A while ago, I made a module which basically extended bigarrays with a few more functions. However, I wanted to have a distinction between read-only and read-write values. The equivalence with bigarrays was irrelevant, so my interface just looked like this:

type ro
type rw
type 'a t
val read_only : 'a t -> ro t
val get : 'a t -> int -> int
val put : rw t -> int -> int -> unit
...

Basically, any function that wrote to the type would have to take a "rw t", but anything else would take " 'a t". From what I know about C, "ro" behaves like the "const" qualifier - not water-proof but it catches some of my common mistakes.

Now, however, I want to re-export the equivalence between 'a t and bigarrays (mostly for the .{} operator), but also have the read-only/read-write distinction. The problem is that if I write:
type 'a t = (int, int8_unsigned_elt, c_layout) Array1.t

then OCaml will see that "ro t" and "rw t" are the same and freely let me use "ro t" values in, for example, the "put" function above.

To summarize, is there a way to make two types internally represented by bigarrays, the first of which:
* can use the bigarray functions (specifically .{} )
* can use all of my new functions
and the second type
* can't use bigarray functions
* can only use a subset of my new functions

I don't want to have two different versions of each function that I have to keep track of.

Thanks,
Reed Wilson

--
รง