Ho una sorta di linguaggio minimale (una sorta di parser per CLI simile a CISCO) con parser descritto di seguito. Il parser dovrebbe essere serializzabile su JSON, ecco perché non Parsec o Attoparsec.
Ho bisogno di una sorta di albero di completamento per quei comandi, cioè per ogni prefisso ci dovrebbero essere tutti i possibili comandi secondari. Il tipo Cp
descrive la struttura di comando di base, cioè l'intera lingua ha tipo [Cp]
.
Per costruire un albero di completamento devo attraversare ricorsivamente il tipo Cp
e costruire tutte le possibili coppie (Prefix, [Completion])
.
So come farlo manualmente. So come farlo con uniplate (para dovrebbe funzionare). La domanda è: sono un sostituto moderno pieghevole / attraversabile per Uniplate, dovrei implementarlo usando uno di questi?
Per me sembra che i tipi di Traversable
non corrispondano al mio caso. Che dire di Foldable
? Dovrei usarlo o uniplate è ancora attuale e soluzione per casi come questo?
type Str = Text
data Command = Command Prefix CmdArgs
deriving Show
type Prefix = [Str]
type CmdArgs = [CmdArg]
type CmdArg = (Str,Str)
data Cp = P Str -- single token prefix
| Arg Str -- arbitrary string or atom
| B Cp Cp -- branch: first or second
| S Cp Cp -- non-empty sequence of items
| O Cp -- optional sequence
| Discard Cp -- discards result of nested parser
| N -- null parser, parses nothing
deriving (Generic,Show)