/*
 * Copyright 2016-2017 JetBrains s.r.o.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package kotlinx.coroutines.experimental

import kotlinx.coroutines.experimental.NonCancellable.isActive
import kotlinx.coroutines.experimental.selects.SelectInstance
import kotlin.coroutines.experimental.AbstractCoroutineContextElement

/**
 * A non-cancelable job that is always [active][isActive]. It is designed to be used with [run] builder
 * to prevent cancellation of code blocks that need to run without cancellation.
 *
 * Use it like this:
 * ```
 * run(NonCancellable) {
 *     // this code will not be cancelled
 * }
 * ```
 */
object NonCancellable : AbstractCoroutineContextElement(Job), Job {
    /** Always returns `true`. */
    override val isActive: Boolean  get() = true

    /** Always returns `false`. */
    override val isCompleted: Boolean get() = false

    /** Always returns `false`. */
    override fun start(): Boolean = false

    /** Always throws [UnsupportedOperationException]. */
    suspend override fun join() {
        throw UnsupportedOperationException("This job is always active")
    }

    /**
     * Always throws [UnsupportedOperationException].
     * @suppress **This is unstable API and it is subject to change.**
     */
    override fun <R> registerSelectJoin(select: SelectInstance<R>, block: suspend () -> R)  {
        throw UnsupportedOperationException("This job is always active")
    }

    /** Always throws [IllegalStateException]. */
    override fun getCompletionException(): CancellationException = throw IllegalStateException("This job is always active")

    /** Always returns [NonDisposableHandle]. */
    override fun invokeOnCompletion(handler: CompletionHandler): DisposableHandle = NonDisposableHandle

    /** Always returns `false`. */
    override fun cancel(cause: Throwable?): Boolean = false
}
