; Keywords
[
  "as"
  "let"
  "panic"
  "todo"
  "type"
  "use"
] @keyword

; Function Keywords
[
  "fn"
] @keyword.function

; Imports
[
  "import"
] @include

; Conditionals
[
  "case"
  "if"
] @conditional

; Exceptions
[
  "assert"
] @exception

; Punctuation
[
  "("
  ")"
  "<<"
  ">>"
  "["
  "]"
  "{"
  "}"
] @punctuation.bracket

[
  ","
  "."
  ":"
  "->"
] @punctuation.delimiter

[
  "#"
] @punctuation.special

; Operators
[
  "%"
  "&&"
  "*"
  "*."
  "+"
  "+."
  "-"
  "-."
  ".."
  "/"
  "/."
  "<"
  "<."
  "<="
  "<=."
  "="
  "=="
  ">"
  ">."
  ">="
  ">=."
  "|>"
  "||"
] @operator

; Identifiers
(identifier) @variable

; Comments
[
  (comment)
] @comment @spell

[
  (module_comment)
  (statement_comment)
] @comment.documentation @spell

; Unused Identifiers
[
  (discard)
  (hole)
] @comment

; Modules & Imports
(module) @namespace
(import alias: ((identifier) @namespace)?)
(remote_type_identifier module: (identifier) @namespace)
(unqualified_import name: (identifier) @function)

; Strings
(string) @string

; Bit Strings
(bit_string_segment) @string.special

; Numbers
(integer) @number

(float) @float

; Function Parameter Labels
(function_call arguments: (arguments (argument label: (label) @label)))
(function_parameter label: (label)? @label name: (identifier) @parameter)

; Records
(record arguments: (arguments (argument label: (label) @property)?))
(record_pattern_argument  label: (label) @property)
(record_update_argument label: (label) @property)
(field_access record: (identifier) @variable field: (label) @property)
(data_constructor_argument (label) @property)

; Types
[
  (type_identifier)
  (type_parameter)
  (type_var)
] @type

((type_identifier) @type.builtin
  (#any-of? @type.builtin "Int" "Float" "String" "List"))

; Type Qualifiers
[
  "const"
  "external"
  (opacity_modifier)
  (visibility_modifier)
] @type.qualifier

; Tuples
(tuple_access index: (integer) @operator)

; Functions
(function name: (identifier) @function)
(function_call function: (identifier) @function.call)
(function_call function: (field_access field: (label) @function.call))

; External Functions
(external_function name: (identifier) @function)
(external_function_body (string) @namespace . (string) @function)

; Constructors
(constructor_name) @type @constructor

([(type_identifier) (constructor_name)] @constant.builtin
  (#any-of? @constant.builtin "Ok" "Error"))

; Booleans
((constructor_name) @boolean (#any-of? @boolean "True" "False"))

; Pipe Operator
(binary_expression operator: "|>" right: (identifier) @function)
