Array.PermissionedThe Permissioned module gives the ability to restrict permissions on an array, so you can give a function read-only access to an array, create an immutable array, etc.
The meaning of the 'perms parameter is as usual (see the Perms module for more details) with the non-obvious difference that you don't need any permissions to extract the length of an array. This was done for simplicity because some information about the length of an array can leak out even if you only have write permissions since you can catch out-of-bounds errors.
include Bin_prot.Binable.S2 with type ('a, -'perms) t := ('a, 'perms) tval bin_shape_t : Bin_prot.Shape.t -> Bin_prot.Shape.t -> Bin_prot.Shape.tval bin_size_t : ('a, 'b, ('a, 'b) t) Bin_prot.Size.sizer2val bin_write_t : ('a, 'b, ('a, 'b) t) Bin_prot.Write.writer2val bin_read_t : ('a, 'b, ('a, 'b) t) Bin_prot.Read.reader2val __bin_read_t__ : ('a, 'b, int -> ('a, 'b) t) Bin_prot.Read.reader2val bin_writer_t : ('a, 'b, ('a, 'b) t) Bin_prot.Type_class.S2.writerval bin_reader_t : ('a, 'b, ('a, 'b) t) Bin_prot.Type_class.S2.readerval bin_t : ('a, 'b, ('a, 'b) t) Bin_prot.Type_class.S2.tval compare : ('a -> 'a -> Base.Int.t) -> ('perms -> 'perms -> Base.Int.t) -> ('a, 'perms) t -> ('a, 'perms) t -> Base.Int.tinclude Ppx_sexp_conv_lib.Sexpable.S2 with type ('a, -'perms) t := ('a, 'perms) tval t_of_sexp : (Sexplib0.Sexp.t -> 'a) -> (Sexplib0.Sexp.t -> 'b) -> Sexplib0.Sexp.t -> ('a, 'b) tval sexp_of_t : ('a -> Sexplib0.Sexp.t) -> ('b -> Sexplib0.Sexp.t) -> ('a, 'b) t -> Sexplib0.Sexp.tmodule Int : sig ... endmodule Float : sig ... endval of_array_id : 'a Base.Array.t -> ('a, [< Perms.Export.read_write ]) tof_array_id and to_array_id return the same underlying array. On the other hand, to_array (inherited from Container.S1_permissions below) makes a copy.
To create a new (possibly immutable) copy of an array a, use copy (of_array_id
a). More generally, any function that takes a (possibly mutable) t can be called on an array by calling of_array_id on it first.
There is a conceptual type equality between 'a Array.t and ('a, read_write) Array.Permissioned.t. The reason for not exposing this as an actual type equality is that we also want:
'a Array.t = 'a array for interoperability with code which does not use Core.('a, 'perms) Array.Permissioned.t to be abstract, so that the permission phantom type will have an effect.Since we don't control the definition of 'a array, this would require a type ('a, 'perms) Array.Permissioned.t which is abstract, except that ('a, read_write) Array.Permissioned.t is concrete, which is not possible.
val to_array_id : ('a, [> Perms.Export.read_write ]) t -> 'a Base.Array.tval to_sequence_immutable : ('a, [> Perms.Export.immutable ]) t -> 'a Sequence.tto_sequence_immutable t converts t to a sequence. Unlike to_sequence, to_sequence_immutable does not need to copy t since it is immutable.
include Container.S1_permissions with type ('a, 'perms) t := ('a, 'perms) tval mem : ('a, [> Perms.Export.read ]) t -> 'a -> equal:('a -> 'a -> Base.Bool.t) -> Base.Bool.tChecks whether the provided element is there, using polymorphic compare if equal is not provided.
val iter : ('a, [> Perms.Export.read ]) t -> f:('a -> Base.Unit.t) -> Base.Unit.tval fold : ('a, [> Perms.Export.read ]) t -> init:'accum -> f:('accum -> 'a -> 'accum) -> 'accumfold t ~init ~f returns f (... f (f (f init e1) e2) e3 ...) en, where e1..en are the elements of t
val fold_result : ('a, [> Perms.Export.read ]) t -> init:'accum -> f:('accum -> 'a -> ('accum, 'e) Result.t) ->
('accum, 'e) Result.tfold_result t ~init ~f is a short-circuiting version of fold that runs in the Result monad. If f returns an Error _, that value is returned without any additional invocations of f.
val fold_until : ('a, [> Perms.Export.read ]) t -> init:'accum ->
f:('accum -> 'a -> ('accum, 'final) Container_intf.Continue_or_stop.t) -> finish:('accum -> 'final) -> 'finalfold_until t ~init ~f ~finish is a short-circuiting version of fold. If f returns Stop _ the computation ceases and results in that value. If f returns Continue _, the fold will proceed. If f never returns Stop _, the final result is computed by finish.
val exists : ('a, [> Perms.Export.read ]) t -> f:('a -> Base.Bool.t) -> Base.Bool.tReturns true if and only if there exists an element for which the provided function evaluates to true. This is a short-circuiting operation.
val for_all : ('a, [> Perms.Export.read ]) t -> f:('a -> Base.Bool.t) -> Base.Bool.tReturns true if and only if the provided function evaluates to true for all elements. This is a short-circuiting operation.
val count : ('a, [> Perms.Export.read ]) t -> f:('a -> Base.Bool.t) -> Base.Int.tReturns the number of elements for which the provided function evaluates to true.
val sum : (module Base.Container.Summable with type t = 'sum) -> ('a, [> Perms.Export.read ]) t -> f:('a -> 'sum) -> 'sumReturns the sum of f i for i in the container
val find : ('a, [> Perms.Export.read ]) t -> f:('a -> Base.Bool.t) -> 'a Base.Option.tReturns as an option the first element for which f evaluates to true.
val find_map : ('a, [> Perms.Export.read ]) t -> f:('a -> 'b Base.Option.t) -> 'b Base.Option.tReturns the first evaluation of f that returns Some, and returns None if there is no such element.
val to_list : ('a, [> Perms.Export.read ]) t -> 'a Base.List.tval to_array : ('a, [> Perms.Export.read ]) t -> 'a Base.Array.tval min_elt : ('a, [> Perms.Export.read ]) t -> compare:('a -> 'a -> Base.Int.t) -> 'a Base.Option.tReturns a min (resp max) element from the collection using the provided compare function. In case of a tie, the first element encountered while traversing the collection is returned. The implementation uses fold so it has the same complexity as fold. Returns None iff the collection is empty.
val max_elt : ('a, [> Perms.Export.read ]) t -> compare:('a -> 'a -> Base.Int.t) -> 'a Base.Option.tinclude Blit.S1_permissions with type ('a, 'perms) t := ('a, 'perms) tval blit : (('a, [> Perms.Export.read ]) t, ('a, [> Perms.Export.write ]) t) Base.Blit.blitval blito : (('a, [> Perms.Export.read ]) t, ('a, [> Perms.Export.write ]) t) Base.Blit.blitoval unsafe_blit : (('a, [> Perms.Export.read ]) t, ('a, [> Perms.Export.write ]) t) Base.Blit.blitval sub : (('a, [> Perms.Export.read ]) t, ('a, [< _ Perms.Export.perms ]) t) Base.Blit.subval subo : (('a, [> Perms.Export.read ]) t, ('a, [< _ Perms.Export.perms ]) t) Base.Blit.suboinclude Binary_searchable.S1_permissions with type ('a, 'perms) t := ('a, 'perms) tval binary_search : (('a, [> Perms.Export.read ]) t, 'a, 'key) Base.Binary_searchable.binary_searchval binary_search_segmented : (('a, [> Perms.Export.read ]) t, 'a) Base.Binary_searchable.binary_search_segmentedThese functions are in Container.S1_permissions, but they are re-exposed here so that their types can be changed to make them more permissive (see comment above).
val length : (_, _) t -> Base.Int.tval is_empty : (_, _) t -> Base.Bool.tcounterparts of regular array functions above
val get : ('a, [> Perms.Export.read ]) t -> Base.Int.t -> 'aval set : ('a, [> Perms.Export.write ]) t -> Base.Int.t -> 'a -> Base.Unit.tval unsafe_get : ('a, [> Perms.Export.read ]) t -> Base.Int.t -> 'aval unsafe_set : ('a, [> Perms.Export.write ]) t -> Base.Int.t -> 'a -> Base.Unit.tval create : len:Base.Int.t -> 'a -> ('a, [< _ Perms.Export.perms ]) tval init : Base.Int.t -> f:(Base.Int.t -> 'a) -> ('a, [< _ Perms.Export.perms ]) tval make_matrix : dimx:Base.Int.t -> dimy:Base.Int.t -> 'a -> (('a, [< _ Perms.Export.perms ]) t, [< _ Perms.Export.perms ]) tval append : ('a, [> Perms.Export.read ]) t -> ('a, [> Perms.Export.read ]) t -> ('a, [< _ Perms.Export.perms ]) tval concat : ('a, [> Perms.Export.read ]) t Base.List.t -> ('a, [< _ Perms.Export.perms ]) tval copy : ('a, [> Perms.Export.read ]) t -> ('a, [< _ Perms.Export.perms ]) tval fill : ('a, [> Perms.Export.write ]) t -> pos:Base.Int.t -> len:Base.Int.t -> 'a -> Base.Unit.tval of_list : 'a Base.List.t -> ('a, [< _ Perms.Export.perms ]) tval map : ('a, [> Perms.Export.read ]) t -> f:('a -> 'b) -> ('b, [< _ Perms.Export.perms ]) tval mapi : ('a, [> Perms.Export.read ]) t -> f:(Base.Int.t -> 'a -> 'b) -> ('b, [< _ Perms.Export.perms ]) tval folding_map : ('a, [> Perms.Export.read ]) t -> init:'b -> f:('b -> 'a -> 'b * 'c) ->
('c, [< _ Perms.Export.perms ]) tval iteri : ('a, [> Perms.Export.read ]) t -> f:(Base.Int.t -> 'a -> Base.Unit.t) -> Base.Unit.tval foldi : ('a, [> Perms.Export.read ]) t -> init:'b -> f:(Base.Int.t -> 'b -> 'a -> 'b) -> 'bval folding_mapi : ('a, [> Perms.Export.read ]) t -> init:'b -> f:(Base.Int.t -> 'b -> 'a -> 'b * 'c) ->
('c, [< _ Perms.Export.perms ]) tval fold_right : ('a, [> Perms.Export.read ]) t -> f:('a -> 'b -> 'b) -> init:'b -> 'bval sort : ?pos:Base.Int.t -> ?len:Base.Int.t -> ('a, [> Perms.Export.read_write ]) t -> compare:('a -> 'a -> Base.Int.t) -> Base.Unit.tval stable_sort : ('a, [> Perms.Export.read_write ]) t -> compare:('a -> 'a -> Base.Int.t) -> Base.Unit.tval is_sorted : ('a, [> Perms.Export.read ]) t -> compare:('a -> 'a -> Base.Int.t) -> Base.Bool.tval is_sorted_strictly : ('a, [> Perms.Export.read ]) t -> compare:('a -> 'a -> Base.Int.t) -> Base.Bool.tval concat_map : ('a, [> Perms.Export.read ]) t -> f:('a -> ('b, [> Perms.Export.read ]) t) -> ('b, [< _ Perms.Export.perms ]) tval concat_mapi : ('a, [> Perms.Export.read ]) t -> f:(Base.Int.t -> 'a -> ('b, [> Perms.Export.read ]) t) -> ('b, [< _ Perms.Export.perms ]) tval partition_tf : ('a, [> Perms.Export.read ]) t -> f:('a -> Base.Bool.t) -> ('a, [< _ Perms.Export.perms ]) t * ('a, [< _ Perms.Export.perms ]) tval partitioni_tf : ('a, [> Perms.Export.read ]) t -> f:(Base.Int.t -> 'a -> Base.Bool.t) ->
('a, [< _ Perms.Export.perms ]) t * ('a, [< _ Perms.Export.perms ]) tval cartesian_product : ('a, [> Perms.Export.read ]) t -> ('b, [> Perms.Export.read ]) t -> ('a * 'b, [< _ Perms.Export.perms ]) tval transpose : (('a, [> Perms.Export.read ]) t, [> Perms.Export.read ]) t -> (('a, [< _ Perms.Export.perms ]) t, [< _ Perms.Export.perms ]) t Base.Option.tval transpose_exn : (('a, [> Perms.Export.read ]) t, [> Perms.Export.read ]) t -> (('a, [< _ Perms.Export.perms ]) t, [< _ Perms.Export.perms ]) tval normalize : (_, _) t -> Base.Int.t -> Base.Int.tval slice : ('a, [> Perms.Export.read ]) t -> Base.Int.t -> Base.Int.t -> ('a, [< _ Perms.Export.perms ]) tval nget : ('a, [> Perms.Export.read ]) t -> Base.Int.t -> 'aval nset : ('a, [> Perms.Export.write ]) t -> Base.Int.t -> 'a -> Base.Unit.tval filter_opt : ('a Base.Option.t, [> Perms.Export.read ]) t -> ('a, [< _ Perms.Export.perms ]) tval filter_map : ('a, [> Perms.Export.read ]) t -> f:('a -> 'b Base.Option.t) -> ('b, [< _ Perms.Export.perms ]) tval filter_mapi : ('a, [> Perms.Export.read ]) t -> f:(Base.Int.t -> 'a -> 'b Base.Option.t) -> ('b, [< _ Perms.Export.perms ]) tval for_alli : ('a, [> Perms.Export.read ]) t -> f:(Base.Int.t -> 'a -> Base.Bool.t) -> Base.Bool.tval existsi : ('a, [> Perms.Export.read ]) t -> f:(Base.Int.t -> 'a -> Base.Bool.t) -> Base.Bool.tval counti : ('a, [> Perms.Export.read ]) t -> f:(Base.Int.t -> 'a -> Base.Bool.t) -> Base.Int.tval iter2_exn : ('a, [> Perms.Export.read ]) t -> ('b, [> Perms.Export.read ]) t -> f:('a -> 'b -> Base.Unit.t) -> Base.Unit.tval map2_exn : ('a, [> Perms.Export.read ]) t -> ('b, [> Perms.Export.read ]) t -> f:('a -> 'b -> 'c) -> ('c, [< _ Perms.Export.perms ]) tval fold2_exn : ('a, [> Perms.Export.read ]) t -> ('b, [> Perms.Export.read ]) t -> init:'c -> f:('c -> 'a -> 'b -> 'c) -> 'cval for_all2_exn : ('a, [> Perms.Export.read ]) t -> ('b, [> Perms.Export.read ]) t -> f:('a -> 'b -> Base.Bool.t) -> Base.Bool.tval exists2_exn : ('a, [> Perms.Export.read ]) t -> ('b, [> Perms.Export.read ]) t -> f:('a -> 'b -> Base.Bool.t) -> Base.Bool.tval filter : ('a, [> Perms.Export.read ]) t -> f:('a -> Base.Bool.t) -> ('a, [< _ Perms.Export.perms ]) tval filteri : ('a, [> Perms.Export.read ]) t -> f:(Base.Int.t -> 'a -> Base.Bool.t) -> ('a, [< _ Perms.Export.perms ]) tval swap : ('a, [> Perms.Export.read_write ]) t -> Base.Int.t -> Base.Int.t -> Base.Unit.tval rev_inplace : ('a, [> Perms.Export.read_write ]) t -> Base.Unit.tval of_list_rev : 'a Base.List.t -> ('a, [< _ Perms.Export.perms ]) tval of_list_map : 'a Base.List.t -> f:('a -> 'b) -> ('b, [< _ Perms.Export.perms ]) tval of_list_mapi : 'a Base.List.t -> f:(Base.Int.t -> 'a -> 'b) -> ('b, [< _ Perms.Export.perms ]) tval of_list_rev_map : 'a Base.List.t -> f:('a -> 'b) -> ('b, [< _ Perms.Export.perms ]) tval of_list_rev_mapi : 'a Base.List.t -> f:(Base.Int.t -> 'a -> 'b) -> ('b, [< _ Perms.Export.perms ]) tval map_inplace : ('a, [> Perms.Export.read_write ]) t -> f:('a -> 'a) -> Base.Unit.tval find_exn : ('a, [> Perms.Export.read ]) t -> f:('a -> Base.Bool.t) -> 'aval find_map_exn : ('a, [> Perms.Export.read ]) t -> f:('a -> 'b Base.Option.t) -> 'bval findi : ('a, [> Perms.Export.read ]) t -> f:(Base.Int.t -> 'a -> Base.Bool.t) -> (Base.Int.t * 'a) Base.Option.tval findi_exn : ('a, [> Perms.Export.read ]) t -> f:(Base.Int.t -> 'a -> Base.Bool.t) -> Base.Int.t * 'aval find_mapi : ('a, [> Perms.Export.read ]) t -> f:(Base.Int.t -> 'a -> 'b Base.Option.t) -> 'b Base.Option.tval find_mapi_exn : ('a, [> Perms.Export.read ]) t -> f:(Base.Int.t -> 'a -> 'b Base.Option.t) -> 'bval find_consecutive_duplicate : ('a, [> Perms.Export.read ]) t -> equal:('a -> 'a -> Base.Bool.t) -> ('a * 'a) Base.Option.tval reduce : ('a, [> Perms.Export.read ]) t -> f:('a -> 'a -> 'a) -> 'a Base.Option.tval reduce_exn : ('a, [> Perms.Export.read ]) t -> f:('a -> 'a -> 'a) -> 'aval permute : ?random_state:Base.Random.State.t -> ('a, [> Perms.Export.read_write ]) t -> Base.Unit.tval zip : ('a, [> Perms.Export.read ]) t -> ('b, [> Perms.Export.read ]) t -> ('a * 'b, [< _ Perms.Export.perms ]) t Base.Option.tval zip_exn : ('a, [> Perms.Export.read ]) t -> ('b, [> Perms.Export.read ]) t -> ('a * 'b, [< _ Perms.Export.perms ]) tval unzip : ('a * 'b, [> Perms.Export.read ]) t -> ('a, [< _ Perms.Export.perms ]) t * ('b, [< _ Perms.Export.perms ]) tval sorted_copy : ('a, [> Perms.Export.read ]) t -> compare:('a -> 'a -> Base.Int.t) -> ('a, [< _ Perms.Export.perms ]) tval last : ('a, [> Perms.Export.read ]) t -> 'aval equal : ('a -> 'a -> Base.Bool.t) -> ('a, [> Perms.Export.read ]) t -> ('a, [> Perms.Export.read ]) t -> Base.Bool.tval to_sequence : ('a, [> Perms.Export.read ]) t -> 'a Sequence.tval to_sequence_mutable : ('a, [> Perms.Export.read ]) t -> 'a Sequence.t