use derive_more::Constructor;
use crate::code_point::CodePoint;
use crate::structure::Located;
use crate::structure::rlt::new_types::*;
use crate::structure::rlt::top_level::TopLevelNode;
#[derive(Debug, Clone, PartialEq)]
pub enum Module {
    Global {
        keyword: Keyword,
        id: TypeName,
        flow: Symbol,
        rest: Box<[TopLevelNode]>,
    },
    Ordinary {
        keyword: Keyword,
        id: TypeName,
        lbrace: Symbol,
        rest: Box<[TopLevelNode]>,
        rbrace: Symbol,
    },
}
#[derive(Debug, Clone, PartialEq, Constructor)]
pub struct File(pub Box<[Module]>);
#[derive(Debug, Clone, PartialEq)]
pub struct RLT(pub File);
impl Module {
    pub fn get_keyword(&self) -> &Keyword {
        match self {
            Module::Global { keyword, .. } => keyword,
            Module::Ordinary { keyword, .. } => keyword,
        }
    }
}
impl Located for Module {
    fn location(&self) -> CodePoint {
        self.get_keyword().location()
    }
}
impl Located for File {
    fn location(&self) -> CodePoint {
        CodePoint::new(0, 0)
    }
}