{
  liminix, lib, lim, s6
}:
{ service, interval, threshold, healthCheck } :
let
  inherit (liminix.services) oneshot longrun;
  inherit (builtins) toString;
  inherit (service) name;
  checker = let name' = "check-${name}"; in longrun {
    name = name';
    run = ''
      fails=0
      echo waiting for /run/service/${name}
      ${s6}/bin/s6-svwait -U /run/service/${name} || exit
      while sleep ${toString interval} ; do
        ${healthCheck}
        if test $? -gt 0; then
          fails=$(expr $fails + 1)
        else
          fails=0
        fi
        echo fails $fails/${toString threshold} for ${name}
        if test "$fails" -gt "${toString threshold}" ; then
          echo time to die
          ${s6}/bin/s6-svc -r /run/service/${name}
          echo bounced
          fails=0
          echo waiting for /run/service/${name}
          ${s6}/bin/s6-svwait -U /run/service/${name}
        fi
      done
    '';
  };
in service.overrideAttrs(o: {
  buildInputs =  (lim.orEmpty o.buildInputs) ++ [ checker ];
  dependencies = (lim.orEmpty o.dependencies) ++ [ checker ];
})