(** Reusable plug collections for route groups (Phoenix-style pipelines). *) type t = Core.t list let empty : t = [] let create (plugs : Core.t list) : t = plugs let plug (t : t) (p : Core.t) : t = t @ [ p ] let plug_first (t : t) (p : Core.t) : t = p :: t let compose (t1 : t) (t2 : t) : t = t1 @ t2 let to_plug (t : t) : Core.t = Core.compose_all t let apply (t : t) (handler : Core.handler) : Core.handler = Core.apply (to_plug t) handler let is_empty (t : t) : bool = t = [] let length (t : t) : int = List.length t