text: /*
  Language: F#
  Author: Jonas Follesø <jonas@follesoe.no>
  Contributors: Troy Kershaw <hello@troykershaw.com>, Henrik Feldt <henrik@haf.se>
  Website: https://docs.microsoft.com/en-us/dotnet/fsharp/
  Category: functional
  */
  
  /** @type LanguageFn */
  export default function(hljs) {
    const TYPEPARAM = {
      begin: '<',
      end: '>',
      contains: [
        hljs.inherit(hljs.TITLE_MODE, {
          begin: /'[a-zA-Z0-9_]+/
        })
      ]
    };
  
    const KEYWORDS = [
      "abstract",
      "and",
      "as",
      "assert",
      "base",
      "begin",
      "class",
      "default",
      "delegate",
      "do",
      "done",
      "downcast",
      "downto",
      "elif",
      "else",
      "end",
      "exception",
      "extern",
      "false",
      "finally",
      "for",
      "fun",
      "function",
      "global",
      "if",
      "in",
      "inherit",
      "inline",
      "interface",
      "internal",
      "lazy",
      "let",
      "match",
      "member",
      "module",
      "mutable",
      "namespace",
      "new",
      "null",
      "of",
      "open",
      "or",
      "override",
      "private",
      "public",
      "rec",
      "return",
      "sig",
      "static",
      "struct",
      "then",
      "to",
      "true",
      "try",
      "type",
      "upcast",
      "use",
      "val",
      "void",
      "when",
      "while",
      "with",
      "yield"
    ];
  
    return {
      name: 'F#',
      aliases: [
        'fs',
        'f#'
      ],
      keywords: KEYWORDS,
      illegal: /\/\*/,
      contains: [
        {
          // monad builder keywords (matches before non-bang kws)
          className: 'keyword',
          begin: /\b(yield|return|let|do)!/
        },
        {
          className: 'string',
          begin: '@"',
          end: '"',
          contains: [
            {
              begin: '""'
            }
          ]
        },
        {
          className: 'string',
          begin: '"""',
          end: '"""'
        },
        hljs.COMMENT('\\(\\*(\\s)', '\\*\\)', {
          contains: ["self"]
        }),
        {
          className: 'class',
          beginKeywords: 'type',
          end: '\\(|=|$',
          excludeEnd: true,
          contains: [
            hljs.UNDERSCORE_TITLE_MODE,
            TYPEPARAM
          ]
        },
        {
          className: 'meta',
          begin: '\\[<',
          end: '>\\]',
          relevance: 10
        },
        {
          className: 'symbol',
          begin: '\\B(\'[A-Za-z])\\b',
          contains: [hljs.BACKSLASH_ESCAPE]
        },
        hljs.C_LINE_COMMENT_MODE,
        hljs.inherit(hljs.QUOTE_STRING_MODE, {
          illegal: null
        }),
        hljs.C_NUMBER_MODE
      ]
    };
  }
  