sig
  type term = Nunchaku_core.TermInner.Default.t
  type mode = M_data | M_codata
  val pp_mode : ElimData.mode CCFormat.printer
  module type S =
    sig
      type decode_state
      val mode : ElimData.mode
      val name : string
      val transform_pb :
        (ElimData.term, ElimData.term) Nunchaku_core.Problem.t ->
        (ElimData.term, ElimData.term) Nunchaku_core.Problem.t *
        ElimData.S.decode_state
      val decode_model :
        ElimData.S.decode_state ->
        (ElimData.term, ElimData.term) Nunchaku_core.Model.t ->
        (ElimData.term, ElimData.term) Nunchaku_core.Model.t
      val pipe :
        print:bool ->
        check:bool ->
        ((ElimData.term, ElimData.term) Nunchaku_core.Problem.t,
         (ElimData.term, ElimData.term) Nunchaku_core.Problem.t,
         (ElimData.term, ElimData.term) Nunchaku_core.Problem.Res.t,
         (ElimData.term, ElimData.term) Nunchaku_core.Problem.Res.t)
        Nunchaku_core.Transform.t
      val pipe_with :
        ?on_decoded:('-> unit) list ->
        decode:(ElimData.S.decode_state -> '-> 'd) ->
        print:bool ->
        check:bool ->
        ((ElimData.term, ElimData.term) Nunchaku_core.Problem.t,
         (ElimData.term, ElimData.term) Nunchaku_core.Problem.t, 'c, 'd)
        Nunchaku_core.Transform.t
    end
  module Data : S
  module Codata : S
end