/*
 * Copyright 2026 Sergey S. Chernov real.sergeych@gmail.com
 *
 * 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.
 *
 */

@file:Suppress("unused")

package net.sergeych.lyng

// this is highly experimental and subject to complete redesign
// very soon
sealed class TypeDecl(val isNullable:Boolean = false) {
    enum class Variance { In, Out, Invariant }
    // ??
    data class Function(
        val receiver: TypeDecl?,
        val contextReceivers: List<TypeDecl> = emptyList(),
        val params: List<TypeDecl>,
        val returnType: TypeDecl,
        val nullable: Boolean = false
    ) : TypeDecl(nullable)
    data class Ellipsis(
        val elementType: TypeDecl,
        val nullable: Boolean = false
    ) : TypeDecl(nullable)
    data class TypeVar(val name: String, val nullable: Boolean = false) : TypeDecl(nullable)
    data class Union(val options: List<TypeDecl>, val nullable: Boolean = false) : TypeDecl(nullable)
    data class Intersection(val options: List<TypeDecl>, val nullable: Boolean = false) : TypeDecl(nullable)
    data class TypeParam(
        val name: String,
        val variance: Variance = Variance.Invariant,
        val bound: TypeDecl? = null,
        val defaultType: TypeDecl? = null
    )
    object TypeAny : TypeDecl()
    object TypeNullableAny : TypeDecl(true)

    class Simple(val name: String, isNullable: Boolean) : TypeDecl(isNullable)
    class Generic(val name: String, val args: List<TypeDecl>, isNullable: Boolean) : TypeDecl(isNullable)
}
