aboutsummaryrefslogtreecommitdiffhomepage
path: root/ide/document.mli
blob: c610f275c3ddf2b766dc32010c02f8278773d21a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
(************************************************************************)
(*  v      *   The Coq Proof Assistant  /  The Coq Development Team     *)
(* <O___,, *   INRIA - CNRS - LIX - LRI - PPS - Copyright 1999-2010     *)
(*   \VV/  **************************************************************)
(*    //   *      This file is distributed under the terms of the       *)
(*         *       GNU Lesser General Public License Version 2.1        *)
(************************************************************************)

(** Based on OCaml stacks, it is the structure used by CoqIDE to represent
    the document *)

type 'a t

exception Empty
(** Alias for Stack.Empty. *)

val create : unit -> 'a t
(** Create an empty stack. *)

val push : 'a -> 'a t -> unit
(** Add an element to a stack. *)

val find : ('a -> bool -> bool) -> 'a t -> 'a
(** Find the first element satisfying the predicate.
    The boolean tells If the element is inside the focused zone.
    @raise Not_found it there is none. *)

val is_empty : 'a t -> bool
(** Whether a stack is empty. *)

val iter : ('a -> bool -> unit) -> 'a t -> unit
(** Iterate a function over elements, from the last added one. 
    The boolean tells If the element is inside the focused zone. *)

val clear : 'a t -> unit
(** Empty a stack. *)

val length : 'a t -> int
(** Length of a stack. *)

val pop  : 'a t -> 'a
(** Remove and returns the first element of the stack.
    @raise Empty if empty. *)

val tip  : 'a t -> 'a
(** Remove the first element of the stack without modifying it.
    @raise Empty if empty. *)

val to_list : 'a t -> 'a list
(** Convert to a list. *)

val find_map : ('a -> bool -> 'b option) -> 'a t -> 'b
(** Find the first element that returns [Some _].
    The boolean tells If the element is inside the focused zone.
    @raise Not_found it there is none. *)

type ('b, 'c) seek = ('b, 'c) CSig.seek = Stop of 'b | Next of 'c

(** [seek f acc s] acts like [List.fold_left f acc s] while [f] returns
    [Next acc']; it stops returning [b] as soon as [f] returns [Stop b].
    The stack is traversed from the top and is not altered.
    @raise Not_found it there is none. *)
val fold_until : ('c -> 'a -> ('b, 'c) seek) -> 'c -> 'a t -> 'b

(** After [focus s c1 c2] the top of [s] is the topmost element [x] such that
    [c1 x] is [true] and the bottom is the first element [y] following [x]
    such that [c2 y] is [true].  After a focus push/pop/top/fold_until
    only use the focused part.
    @raise Invalid_argument "CStack.focus" if there is no such [x] and [y] *)
val focus : 'a t -> cond_top:('a -> bool) -> cond_bot:('a -> bool) -> unit

(** Undoes a [focus].
    @raise Invalid_argument "CStack.unfocus" if the stack is not focused *)
val unfocus : 'a t -> unit

(** Is the stack focused *)
val focused : 'a t -> bool

(** Returns [top, s, bot] where [top @ s @ bot] is the full stack, and [s]
    the focused part *)
val to_lists : 'a t -> 'a list * 'a list * 'a list