mirror of
https://github.com/c-cube/ocaml-containers.git
synced 2026-01-28 20:04:51 -05:00
allow padding in PrintBox
This commit is contained in:
parent
5422a6ad65
commit
13634950b1
2 changed files with 41 additions and 20 deletions
|
|
@ -153,6 +153,7 @@ module Box = struct
|
||||||
| Line of string
|
| Line of string
|
||||||
| Text of string list (* in a box *)
|
| Text of string list (* in a box *)
|
||||||
| Frame of 'a
|
| Frame of 'a
|
||||||
|
| Pad of int * 'a
|
||||||
| Grid of grid_shape * 'a array array
|
| Grid of grid_shape * 'a array array
|
||||||
|
|
||||||
type t = {
|
type t = {
|
||||||
|
|
@ -221,6 +222,10 @@ module Box = struct
|
||||||
| Frame t ->
|
| Frame t ->
|
||||||
let {x;y} = size t in
|
let {x;y} = size t in
|
||||||
{ x=x+2; y=y+2; }
|
{ x=x+2; y=y+2; }
|
||||||
|
| Pad (n, b') ->
|
||||||
|
assert (n>0);
|
||||||
|
let {x;y} = size b' in
|
||||||
|
{ x=x+2*n; y=y+2*n; }
|
||||||
| Grid (_,m) ->
|
| Grid (_,m) ->
|
||||||
let dim = _dim_matrix m in
|
let dim = _dim_matrix m in
|
||||||
let lines, columns = _size_matrix m in
|
let lines, columns = _size_matrix m in
|
||||||
|
|
@ -250,25 +255,32 @@ let bool_ x = line (string_of_bool x)
|
||||||
let frame b =
|
let frame b =
|
||||||
Box._make (Box.Frame b)
|
Box._make (Box.Frame b)
|
||||||
|
|
||||||
let grid ?(framed=true) m =
|
let pad' n b =
|
||||||
Box._make (Box.Grid ((if framed then Box.GridFramed else Box.GridBase), m))
|
assert (n>=0);
|
||||||
|
if n=0 then b else Box._make (Box.Pad (n, b))
|
||||||
|
|
||||||
let init_grid ?framed ~line ~col f =
|
let pad b = pad' 1 b
|
||||||
|
|
||||||
|
let grid ?(pad=false) ?(framed=true) m =
|
||||||
|
let b = Box._make (Box.Grid ((if framed then Box.GridFramed else Box.GridBase), m)) in
|
||||||
|
if pad then pad' 1 b else b
|
||||||
|
|
||||||
|
let init_grid ?pad ?framed ~line ~col f =
|
||||||
let m = Array.init line (fun j-> Array.init col (fun i -> f ~line:j ~col:i)) in
|
let m = Array.init line (fun j-> Array.init col (fun i -> f ~line:j ~col:i)) in
|
||||||
grid ?framed m
|
grid ?pad ?framed m
|
||||||
|
|
||||||
let vlist ?framed l =
|
let vlist ?pad ?framed l =
|
||||||
let a = Array.of_list l in
|
let a = Array.of_list l in
|
||||||
grid ?framed (Array.map (fun line -> [| line |]) a)
|
grid ?pad ?framed (Array.map (fun line -> [| line |]) a)
|
||||||
|
|
||||||
let hlist ?framed l =
|
let hlist ?pad ?framed l =
|
||||||
grid ?framed [| Array.of_list l |]
|
grid ?pad ?framed [| Array.of_list l |]
|
||||||
|
|
||||||
let hlist_map ?framed f l = hlist ?framed (List.map f l)
|
let hlist_map ?pad ?framed f l = hlist ?pad ?framed (List.map f l)
|
||||||
let vlist_map ?framed f l = vlist ?framed (List.map f l)
|
let vlist_map ?pad ?framed f l = vlist ?pad ?framed (List.map f l)
|
||||||
let grid_map ?framed f m = grid ?framed (Array.map (Array.map f) m)
|
let grid_map ?pad ?framed f m = grid ?pad ?framed (Array.map (Array.map f) m)
|
||||||
|
|
||||||
let grid_text ?framed m = grid_map ?framed text m
|
let grid_text ?pad ?framed m = grid_map ?pad ?framed text m
|
||||||
|
|
||||||
let transpose m =
|
let transpose m =
|
||||||
let dim = Box._dim_matrix m in
|
let dim = Box._dim_matrix m in
|
||||||
|
|
@ -307,6 +319,9 @@ let rec _render ?expected_size ~out b pos =
|
||||||
_write_vline out (_move_y pos 1) y;
|
_write_vline out (_move_y pos 1) y;
|
||||||
_write_vline out (_move pos (x+1) 1) y;
|
_write_vline out (_move pos (x+1) 1) y;
|
||||||
_render ~out b' (_move pos 1 1)
|
_render ~out b' (_move pos 1 1)
|
||||||
|
| Box.Pad (n, b') ->
|
||||||
|
let expected_size = Box.size b in
|
||||||
|
_render ~expected_size ~out b' (_move pos n n)
|
||||||
| Box.Grid (grid_shape,m) ->
|
| Box.Grid (grid_shape,m) ->
|
||||||
let dim = Box._dim_matrix m in
|
let dim = Box._dim_matrix m in
|
||||||
let lines, columns = Box._size_matrix m in
|
let lines, columns = Box._size_matrix m in
|
||||||
|
|
|
||||||
|
|
@ -121,34 +121,40 @@ val float_ : float -> Box.t
|
||||||
val frame : Box.t -> Box.t
|
val frame : Box.t -> Box.t
|
||||||
(** Put a single frame around the box *)
|
(** Put a single frame around the box *)
|
||||||
|
|
||||||
val grid : ?framed:bool -> Box.t array array -> Box.t
|
val pad : Box.t -> Box.t
|
||||||
|
(** Pad the given box with some free space *)
|
||||||
|
|
||||||
|
val pad' : int -> Box.t -> Box.t
|
||||||
|
(** Pad with the given number of free cells *)
|
||||||
|
|
||||||
|
val grid : ?pad:bool -> ?framed:bool -> Box.t array array -> Box.t
|
||||||
(** Grid of boxes (no frame between boxes). The matrix is indexed
|
(** Grid of boxes (no frame between boxes). The matrix is indexed
|
||||||
with lines first, then columns. The array must be a proper matrix,
|
with lines first, then columns. The array must be a proper matrix,
|
||||||
that is, all lines must have the same number of columns!
|
that is, all lines must have the same number of columns!
|
||||||
@param framed if [true], each item of the grid will be framed.
|
@param framed if [true], each item of the grid will be framed.
|
||||||
default value is [true] *)
|
default value is [true] *)
|
||||||
|
|
||||||
val grid_text : ?framed:bool -> string array array -> Box.t
|
val grid_text : ?pad:bool -> ?framed:bool -> string array array -> Box.t
|
||||||
(** Same as {!grid}, but wraps every cell into a {!text} box *)
|
(** Same as {!grid}, but wraps every cell into a {!text} box *)
|
||||||
|
|
||||||
val transpose : 'a array array -> 'a array array
|
val transpose : 'a array array -> 'a array array
|
||||||
(** Transpose a matrix *)
|
(** Transpose a matrix *)
|
||||||
|
|
||||||
val init_grid : ?framed:bool ->
|
val init_grid : ?pad:bool -> ?framed:bool ->
|
||||||
line:int -> col:int -> (line:int -> col:int -> Box.t) -> Box.t
|
line:int -> col:int -> (line:int -> col:int -> Box.t) -> Box.t
|
||||||
(** Same as {!grid} but takes the matrix as a function *)
|
(** Same as {!grid} but takes the matrix as a function *)
|
||||||
|
|
||||||
val vlist : ?framed:bool -> Box.t list -> Box.t
|
val vlist : ?pad:bool -> ?framed:bool -> Box.t list -> Box.t
|
||||||
(** Vertical list of boxes *)
|
(** Vertical list of boxes *)
|
||||||
|
|
||||||
val hlist : ?framed:bool -> Box.t list -> Box.t
|
val hlist : ?pad:bool -> ?framed:bool -> Box.t list -> Box.t
|
||||||
(** Horizontal list of boxes *)
|
(** Horizontal list of boxes *)
|
||||||
|
|
||||||
val grid_map : ?framed:bool -> ('a -> Box.t) -> 'a array array -> Box.t
|
val grid_map : ?pad:bool -> ?framed:bool -> ('a -> Box.t) -> 'a array array -> Box.t
|
||||||
|
|
||||||
val vlist_map : ?framed:bool -> ('a -> Box.t) -> 'a list -> Box.t
|
val vlist_map : ?pad:bool -> ?framed:bool -> ('a -> Box.t) -> 'a list -> Box.t
|
||||||
|
|
||||||
val hlist_map : ?framed:bool -> ('a -> Box.t) -> 'a list -> Box.t
|
val hlist_map : ?pad:bool -> ?framed:bool -> ('a -> Box.t) -> 'a list -> Box.t
|
||||||
|
|
||||||
val render : Output.t -> Box.t -> unit
|
val render : Output.t -> Box.t -> unit
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue