(*
   RE - A regular expression library

   Copyright (C) 2001 Jerome Vouillon
   email: Jerome.Vouillon@pps.jussieu.fr

   This library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation, with
   linking exception; either version 2.1 of the License, or (at
   your option) any later version.

   This library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with this library; if not, write to the Free Software
   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*)

(* Regular expressions *)

module Mark : sig
  type t [@@immediate]

  val compare : t -> t -> int
  val start : t
  val prev : t -> t
  val next : t -> t
  val next2 : t -> t
  val group_count : t -> int
end

module Sem : sig
  type t =
    [ `Longest
    | `Shortest
    | `First
    ]

  val to_dyn : t -> Dyn.t
  val pp : t Fmt.t
end

module Rep_kind : sig
  type t =
    [ `Greedy
    | `Non_greedy
    ]

  val to_dyn : t -> Dyn.t
  val pp : t Fmt.t
end

type expr

val is_eps : expr -> bool
val pp : expr Fmt.t

module Ids : sig
  type t

  val create : unit -> t
end

val cst : Ids.t -> Cset.t -> expr
val empty : Ids.t -> expr
val alt : Ids.t -> expr list -> expr
val seq : Ids.t -> Sem.t -> expr -> expr -> expr
val eps : Ids.t -> expr
val rep : Ids.t -> Rep_kind.t -> Sem.t -> expr -> expr
val mark : Ids.t -> Mark.t -> expr
val pmark : Ids.t -> Pmark.t -> expr
val erase : Ids.t -> Mark.t -> Mark.t -> expr
val before : Ids.t -> Category.t -> expr
val after : Ids.t -> Category.t -> expr
val rename : Ids.t -> expr -> expr

(****)

(* States of the automata *)

module Idx : sig
  type t

  val to_int : t -> int
end

module Status : sig
  type t =
    | Failed
    | Match of Mark_infos.t * Pmark.Set.t
    | Running
end

module State : sig
  type t

  val pp : t Fmt.t
  val dummy : t
  val create : Category.t -> expr -> t
  val idx : t -> Idx.t
  val status_no_mutex : t -> Status.t
  val status : Mutex.t -> t -> Status.t
  val to_dyn : t -> Dyn.t

  module Table : Hashtbl.S with type key = t
end

(****)

(* Computation of the states following a given state *)

module Working_area : sig
  type t

  val create : unit -> t
  val index_count : t -> int
end

val delta : Working_area.t -> Category.t -> Cset.c -> State.t -> State.t
