import gleam/list pub type Token { Comment(String) Whitespace(String) Name(String) Uppername(String) Integer(String) String(String) Let Match Perform Deep Handle // Having keyword token instead of using name prevents keywords used as names Equal Comma DotDot Dot Colon RightArrow Minus Bang Bar Hash At LeftParen RightParen LeftBrace RightBrace LeftSquare RightSquare // Invalid token UnexpectedGrapheme(String) UnterminatedString(String) InvalidEscape(String) } pub fn drop_whitespace(tokens) { list.filter(tokens, fn(token) { case token { #(Whitespace(_), _) -> False _ -> True } }) } pub fn drop_comments(tokens) { list.filter(tokens, fn(token) { case token { #(Comment(_), _) -> False _ -> True } }) } pub fn to_string(token) { case token { Comment(content) -> "//" <> content Whitespace(raw) -> raw Name(raw) -> raw Uppername(raw) -> raw Integer(raw) -> raw String(raw) -> "\"" <> raw <> "\"" Let -> "let" Match -> "match" Perform -> "perform" Deep -> "deep" Handle -> "handle" // Having keyword token instead of using name prevents keywords used as names Equal -> "=" Comma -> "," DotDot -> ".." Dot -> "." Colon -> ":" RightArrow -> "->" Minus -> "-" Bang -> "!" Bar -> "|" Hash -> "#" At -> "@" LeftParen -> "(" RightParen -> ")" LeftBrace -> "{" RightBrace -> "}" LeftSquare -> "[" RightSquare -> "]" // Invalid token UnexpectedGrapheme(raw) -> raw UnterminatedString(raw) -> "\"" <> raw InvalidEscape(raw) -> "\"" <> raw } }