sig
  type 'a t
  type 'a examiner
  type permutation
  val id : Teacher.permutation
  val shuffle : Teacher.permutation
  val fixed_shuffle : Teacher.permutation
  val empty : 'Teacher.t
  val make_teacher :
    'a array -> Teacher.permutation -> ('-> '-> 'b) -> 'Teacher.t
  val teacher_of_fun : ('-> 'a) -> 'Teacher.t
  val ( |-> ) : 'Teacher.t -> 'Teacher.t -> 'Teacher.t
  val repeat : 'Teacher.t -> int -> 'Teacher.t
  val callback_student : ('-> unit) -> 'Teacher.t
  val callback_grades : (float list list -> unit) -> 'Teacher.t
  val callback_both : ('-> float list list -> unit) -> 'Teacher.t
  val reset_grades : 'Teacher.t
  val ignore_grades : 'Teacher.t -> 'Teacher.t
  val really_ignore_grades : 'Teacher.t -> 'Teacher.t
  val teach_until_student :
    ('-> bool) -> ?max:int -> 'Teacher.t -> 'Teacher.t
  val teach_until_grades :
    (float list list -> bool) -> ?max:int -> 'Teacher.t -> 'Teacher.t
  val teach_until_both :
    ('-> float list list -> bool) ->
    ?max:int -> 'Teacher.t -> 'Teacher.t
  val teach_sync : unit Event.event -> 'Teacher.t
  val teach : 'Teacher.t -> '-> 'a
  val teach_graded :
    'Teacher.t -> 'Teacher.examiner list -> '-> 'a * float list list
  val make_strukture_exam : ('-> float) -> 'Teacher.examiner
  val make_data_exam : ('-> '-> float) -> 'b array -> 'Teacher.examiner
  val make_exam : 'Teacher.examiner list -> '-> float list
  val print_grades : float list list -> unit
end