<commit_before><div class="container">
  <section class="header">
    <h4 class="centered"><strong>ember-concurrency</strong> is an <strong>Ember Addon</strong> that enables you to:</h4>

    <div class="row">
      <div class="four columns">
        Use an <strong>Async/Await-like syntax</strong> to easily express complex,
        <strong>cancellable</strong>, and <strong>restartable</strong> tasks.
      </div>
      <div class="four columns">
        <strong>Say goodbye to error-prone boilerplate</strong> for managing asynchrony, including:
        timer cancellation, deactivate &amp; willDestroy hooks,
        isDestroyed checks, and others.
      </div>
      <div class="four columns">
        Loop over streams of <strong>Ember.Evented</strong> events
        (and optionally <strong>Rx.Observables</strong>), with
        built-in <strong>backpressure</strong> support, and no
        <strong>Callback Hell</strong>&trade;.
      </div>
    </div>
  </section>

  <section>
    <h2 class="centered">Basic Example</h2>

    <div class="row">
      <div class="six columns">
        <h3>{{caps-marquee text="ember-concurrency"}}</h3>

        {{code-snippet name="caps-marquee.js"}}
      </div>
      <div class="six columns">
        <h3>{{scrambled-text text="ember-concurrency"}}</h3>

        {{code-snippet name="scrambled-text.js"}}
      </div>
    </div>

    <h5>
      Imagine writing the above using timers:
    </h5>

    <ul>
      <li>You would need to use <strong>callbacks</strong></li>
      <li>These callbacks would require some sort of <strong>recursive call</strong>
          to take the next "step"</li>
      <li>You would need to implement <strong>lifecycle hooks</strong> to stop the animation
          when the component is unrendered</li>
      <li>You would need to <strong>cancel timers</strong> and in some cases add
          <code>if (this.isDestroyed)</code> guards to your callbacks
          to prevent out-of-bounds errors (such as
          <em>"Assertion Failed: calling set on destroyed object"</em>)
      </li>
    </ul>

    <p>
      By leveraging generator function syntax (<code>function *</code> and the
      <code>yield</code> keyword), <strong>ember-concurrency</strong> let's you
      write <strong>extremely clear asynchronous code</strong> and takes care of all the messy stuff:
      tearing down asynchronous tasks (and <code>cancelling</code> them where possible, 
      e.g. <code>AJAX requests</code>), scoping asynchronous tasks to the lifetime
      of the object they live on (e.g. Components), and preventing undesired
      concurrency between tasks.
    </p>

    <h5>
      But that's just the beginning...
    </h5>

    <p>
      Please take a look at the documentation to discover all the ways
      ember-concurrency can help.
    </p><commit_msg>code -> strong<commit_after><div class="container">
  <section class="header">
    <h4 class="centered"><strong>ember-concurrency</strong> is an <strong>Ember Addon</strong> that enables you to:</h4>

    <div class="row">
      <div class="four columns">
        Use an <strong>Async/Await-like syntax</strong> to easily express complex,
        <strong>cancellable</strong>, and <strong>restartable</strong> tasks.
      </div>
      <div class="four columns">
        <strong>Say goodbye to error-prone boilerplate</strong> for managing asynchrony, including:
        timer cancellation, deactivate &amp; willDestroy hooks,
        isDestroyed checks, and others.
      </div>
      <div class="four columns">
        Loop over streams of <strong>Ember.Evented</strong> events
        (and optionally <strong>Rx.Observables</strong>), with
        built-in <strong>backpressure</strong> support, and no
        <strong>Callback Hell</strong>&trade;.
      </div>
    </div>
  </section>

  <section>
    <h2 class="centered">Basic Example</h2>

    <div class="row">
      <div class="six columns">
        <h3>{{caps-marquee text="ember-concurrency"}}</h3>

        {{code-snippet name="caps-marquee.js"}}
      </div>
      <div class="six columns">
        <h3>{{scrambled-text text="ember-concurrency"}}</h3>

        {{code-snippet name="scrambled-text.js"}}
      </div>
    </div>

    <h5>
      Imagine writing the above using timers:
    </h5>

    <ul>
      <li>You would need to use <strong>callbacks</strong></li>
      <li>These callbacks would require some sort of <strong>recursive call</strong>
          to take the next "step"</li>
      <li>You would need to implement <strong>lifecycle hooks</strong> to stop the animation
          when the component is unrendered</li>
      <li>You would need to <strong>cancel timers</strong> and in some cases add
          <code>if (this.isDestroyed)</code> guards to your callbacks
          to prevent out-of-bounds errors (such as
          <em>"Assertion Failed: calling set on destroyed object"</em>)
      </li>
    </ul>

    <p>
      By leveraging generator function syntax (<code>function *</code> and the
      <code>yield</code> keyword), <strong>ember-concurrency</strong> let's you
      write <strong>extremely clear asynchronous code</strong> and takes care of all the messy stuff:
      tearing down asynchronous tasks (and <strong>cancelling</strong> them where possible, 
      e.g. <strong>AJAX requests</strong>), scoping asynchronous tasks to the lifetime
      of the object they live on (e.g. Components), and preventing undesired
      concurrency between tasks.
    </p>

    <h5>
      But that's just the beginning...
    </h5>

    <p>
      Please take a look at the documentation to discover all the ways
      ember-concurrency can help.
    </p>
{'fraction_non_alphanumeric': 0.12616740088105727, 'fraction_numerical': 0.004229074889867841, 'mean_word_length': 2.877049180327869, 'pattern_counts': {'":': 0, '<': 179, '<?xml version=': 0, '>': 180, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6628513', 'n_tokens_mistral': 1726, 'n_tokens_neox': 1625, 'n_words': 526}