/* eslint-disable
    max-len,
*/
// TODO: This file was created by bulk-decaffeinate.
// Fix any style issues and re-enable lint.
/*
 * decaffeinate suggestions:
 * DS102: Remove unnecessary code created because of implicit returns
 * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
 */
//
// * An Angular service which helps with creating recursive directives.
// * @author Mark Lagendijk
// * @license MIT
//
// From: https://github.com/marklagendijk/angular-recursion
/* eslint-disable
    max-len,
*/
// TODO: This file was created by bulk-decaffeinate.
// Fix any style issues and re-enable lint.
/*
 * decaffeinate suggestions:
 * DS102: Remove unnecessary code created because of implicit returns
 * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
 */
//
// * An Angular service which helps with creating recursive directives.
// * @author Mark Lagendijk
// * @license MIT
//
// From: https://github.com/marklagendijk/angular-recursion
angular.module('RecursionHelper', []).factory('RecursionHelper', [
  '$compile',
  function ($compile) {
    /*
    Manually compiles the element, fixing the recursion loop.
    @param element
    @param [link] A post-link function, or an object with function(s) registered via pre and post properties.
    @returns An object containing the linking functions.
    */
    return {
      compile(element, link) {
        // Normalize the link parameter
        if (angular.isFunction(link)) {
          link = { post: link }
        }

        // Break the recursion loop by removing the contents
        const contents = element.contents().remove()
        let compiledContents
        return {
          pre: link && link.pre ? link.pre : null,

          /*
        Compiles and re-adds the contents
        */
          post(scope, element) {
            // Compile the contents
            if (!compiledContents) {
              compiledContents = $compile(contents)
            }

            // Re-add the compiled contents to the element
            compiledContents(scope, function (clone) {
              element.append(clone)
            })

            // Call the post-linking function, if any
            if (link && link.post) {
              link.post.apply(null, arguments)
            }
          }
        }
      }
    }
  }
])
