(comment) @comment @spell

(annot_atom
  doc: (static_string) @spell)

[
  "forall"
  "in"
  "let"
  "default"
  "doc"
  "rec"
  "optional"
  "priority"
  "force"
  "not_exported"
] @keyword

"fun" @keyword.function

"import" @keyword.import

[
  "if"
  "then"
  "else"
] @keyword.conditional

"match" @keyword.conditional

(types) @type

[
  "Array"
  "Number"
  "Dyn"
  "Bool"
  "String"
] @type.builtin

; BUILTIN Constants
(bool) @boolean

"null" @constant.builtin

(enum_tag) @constant

(num_literal) @number

[
  (infix_op)
  "|>"
  "="
  "&"
  "&&"
  "||"
  "=="
  "+"
  "-"
  "*"
  "/"
  "%"
  "!"
  "?"
  "!="
  "<"
  "<="
  ">"
  ">="
  "@"
  ".."
  "=>"
  "++"
] @operator

"or" @keyword.operator

(type_atom) @type

(static_string) @string

(chunk_literal_single) @string

(chunk_literal_multi) @string

(str_esc_char) @string.escape

[
  "{"
  "}"
  "("
  ")"
  "[|"
  "|]"
  "["
  "]"
] @punctuation.bracket

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

(multstr_start) @string

(multstr_end) @string

[
  (interpolation_start)
  (interpolation_end)
] @punctuation.special

(builtin) @function.builtin

(builtin
  "%" @function.builtin)

(fun_expr
  pats: (pattern_fun
    (ident) @variable.parameter))

; application where the head terms is an identifier: function arg1 arg2 arg3
(applicative
  t1: (applicative
    .
    (record_operand
      (atom
        (ident))) @function))

; application where the head terms is a record field path: foo.bar.function arg1 arg2 arg3
(applicative
  t1: (applicative
    .
    (record_operand
      (record_operation_chain)) @function))

(str_chunks) @string

(field_path_elem) @property

(infix_expr
  op: (infix_b_op_6)
  t2: (infix_expr
    (applicative
      .
      (record_operand
        (record_operation_chain) @function))))
