-module(tomlet@lexer). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/tomlet/lexer.gleam"). -export([lex/1]). -export_type([spanned/0]). -if(?OTP_RELEASE >= 27). -define(MODULEDOC(Str), -moduledoc(Str)). -define(DOC(Str), -doc(Str)). -else. -define(MODULEDOC(Str), -compile([])). -define(DOC(Str), -compile([])). -endif. ?MODULEDOC(false). -type spanned() :: {spanned, william:token(), integer()}. -file("src/tomlet/lexer.gleam", 20). ?DOC(false). -spec annotate(list(william:token()), integer(), list(spanned())) -> list(spanned()). annotate(Tokens, Offset, Acc) -> case Tokens of [] -> lists:reverse(Acc); [Token | Rest] -> Width = erlang:byte_size(william:to_source([Token])), annotate(Rest, Offset + Width, [{spanned, Token, Offset} | Acc]) end. -file("src/tomlet/lexer.gleam", 15). ?DOC(false). -spec lex(binary()) -> list(spanned()). lex(Input) -> Tokens = william:tokenise(william:new(), Input), annotate(Tokens, 0, []).