import math { max,
	min,
}

import cli { Command }
import math.complex { complex, Complex }
import os {
	input, user_os, file_ext }

import mod {
	Unused,
	StructEmbed, StructField, StructRefField
	StructMapFieldKey, StructMapFieldValue,
	StructArrayFieldElem, StructFixedArrayFieldElem
	StructMethodArg,
	StructMethodArgGeneric,
	StructMethodRet,
	StructMethodRetGeneric,

	InterfaceField,
	InterfaceMethodArg,
	InterfaceMethodRet,

	FnArg,
	FnArgVariadic
	FnArgGeneric
	FnArgTypeParam1
	FnArgTypeParam2
	FnRet,
	FnRetGeneric
	FnRetTypeParam1,
	FnRetTypeParam2,

	RightOfIs,
	RightOfAs,

	AliasTarget,
	SumVariant1, SumVariant2,
	FnAliasParam, FnAliasRet

	Enum
}

type Alias = AliasTarget
type SumType = SumVariant1 | SumVariant2
type Fn = fn(FnAliasParam) FnAliasRet

struct Struct {
	StructEmbed
	v StructField
	ref &StructRefField
	map map[StructMapFieldKey]StructMapFieldValue
	arr []StructArrayFieldElem
	arr_fixed [2]StructFixedArrayFieldElem
}

fn (s Struct) method(v StructMethodArg) StructMethodRet {
	return StructMethodRet{}
}

fn (s Struct) method_generic[T](v StructMethodArgGeneric[T]) StructMethodRetGeneric[T] {
	return StructMethodRet[T]{}
}

interface Interface {
	v InterfaceField
	f(InterfaceMethodArg) InterfaceMethodRet
}

fn f(v FnArg, vv ...FnArgVariadic) FnRet {
	if v is RightOfIs {}
	_ = v as RightOfAs

	println(Enum.val)

	return FnRet{}
}

fn f2(v Generic<FnArgTypeParam1, FnArgTypeParam2>) Generic<FnRetTypeParam1, FnRetTypeParam2> {}

fn f_generic[T](v FnArgGeneric[T]) FnRetGeneric[T] {
	return FnRetGeneric[T]{}
}

struct App {
	command &Command
}

struct MyCommand {
	Command
}

fn imaginary(im f64) Complex {
	return complex(0, im)
}

fn main() {
	println(max(0.1, 0.2))
	println(min(0.1, 0.2))
	println(user_os())
	println(file_ext('main.v'))
	println(imaginary(1))
}
