Kodumaro :: Konsulta Vortaro on-line

Released on January 15th, 2018
The shadows behind the code.
Konsulta Vortaro

Como exercício de ML, decidi escrever uma versão on-line do Konsulta Vortaro. Fiz em Elm, uma linguagem ML que compila (ou transpila) para Javascript.

O código pode ser encontrado aqui, e vou fazer uma pequena revisão.

Abordagem

Elm possui um desenho de arquitetura bastante interessante, separando o código em modelo, atualização, visualização e inscrições.

Modelo (model) é um tipo definido pelo usuário para representar o estado da aplicação.

Atualização (update) é a função que é chamada cada vez que a aplicação precisa ser atualizada, inclusive na resolução de mônadas, em Elm representadas pelo tipo comando.

Visualização (view) é a função chamada cada vez que a página precisa ser renderizada.

Incrições (subscriptions) é a função que monitora e reage a eventos, retornando uma inscrição, que é avalida e transaformada em uma atualização.

Para escrever o código, segui a arquitetura restritamente, deixando de fora apenas a camada de inscrições (subscriptions).

Cabeçalho

O cabeçalho do arquivo começa na primeira linha e vai até a sétima.

A primeira linha, declaração do módulo, não é necessária aqui, uma vez que se trata do módulo principal (Main), mas resolvi ser metódico.

As linha seguintes importam os módulos dos quais farei uso mais abaixo: Html, Http e Regex.

Fui criterioso e importei explicitamente os recursos em vez de usar exposing (..).

Entrypoint

O ponto de entrada é a função main, declarada na linha 10. Sua assinatura é Program Never Model Msg:

A função chama Html.program, que constrói a aplicação a partir de funções de callback:

  • init retorna o modelo inicial vazio e dispara um comando (mônada) para ser executado e carregar o dicionário.
  • view função declarada no final do arquivo.
  • update declarada em sua própria camada.
  • subscriptions lâmbda vazio.

Modelo

Além de definir o formato do estado da aplicação, a camada de modelo costuma ser responsável pela inicialização da aplicação. Como a inicialização foi muito simples, usei Cmd.(!) com modelo vazio e a função loadWordbook.

A camada de modelo vai da linha 24 até a linha 34.

O modelo em si possui quatro atributos:

  • query a busca feita pelo usuário.
  • content o conteúdo a ser exibido.
  • wordbook o dicionário de palavras em Esperanto.

A busca pelo dicionário é feita pela função loadWordbook, que usa o módulo Http para criar um comando (mônada) para trazer o conteúdo de vortaro.text. Ele usa o nome Load do tipo Msg para informar à função de atualização que foi resolvida a carga.

Atualização

Chegamos à camada de atualização, que vai da linha 41 até a linha 83.

A primeira coisa definida é o tipo Msg, que classifica a troca de mensagens interna da aplicação. Este tipo possui duas apresentações: a busca feita pelo usuário (Query), e a carga do dicionário (Load).

A função de atualização (update) trata a busca do usuário na linha 48, a carga do dicionário na linha 51, e na linha 54 o tratamento de erros na leitura do dicionário.

No tratamento da busca, se a string for maior que um carácter, ele chama a função find para selecionar o conteúdo exibido, caso contrário não exibe nada.

No tratamento da carga, o dicionário é transformado em uma lista de strings e armazenado no modelo.

A função find retorna uma string vazia caso a busca seja menor que dois caracteres. Caso contrário, filtra o dicionário de acordo com a busca usando expressão regular, junta tudo em uma única string e a processa para exibição.

Visualização

A camada de visualização vai da linha 90 até o final do arquivo, e é a coisa mais bizarras de Elm.

O próprio código HTML é gerado usando código, o que me lembra muito a malfadada abordagem da plataforma Seaside, que fracassou justamente por optar por esta abordagem. O que fiz para minizar o problema foi tratar o arquivo gerado como uma aplicação, não uma página, e inseri-la na página de fato usando iframe.

Então não vou me aprofundar nesta parte, trata-se apenas de uma alternativa grotesca para escrever HTML.

Conclusão

Está no ar a versão on-line do Konsulta Vortaro, com código fonte disponível em repositório git.

Achei a sintaxe e forma de programar de Elm muito mais parecidas com Haskell do que com linguagens ML de fato, apesar de ser impura como as demais linguagens da família, diferente da purista Haskell.

A arquitetura é bem interessante, e a camada de visualização tende a ser o ponto fraco da linguagem.

Espero tanto a aplicação Konsulta Vortaro quanto este artigo possam ser úteis.

ECMAScript | Education and Culture | Esperanto | Functional | ML | Personal

DEV Profile 👩‍💻👨‍💻