packages feed

alto-0: src/Alto/Compile/Navigations.hs

{-# LANGUAGE OverloadedStrings #-}
module Alto.Compile.Navigations where

import           Alto.Menu
import           Alto.Compile
import           Control.Lens
import           Control.Monad
import           Control.Monad.Trans
import           Data.ListTrie.Patricia.Map (TrieMap)
import qualified Data.ListTrie.Patricia.Map as LTP
import           Data.Map (Map)
import qualified Data.Text as T

-- | Makes a Patricia Trie into a set of actions.
--   Doesn't handle all Tries.
trieMenu :: [(String, EntryType)] -> MenuM Menu
trieMenu =
    go . LTP.fromList
  where
    go :: TrieMap Map Char EntryType -> MenuM Menu
    go = menu . breakPre
    breakPre :: TrieMap Map Char EntryType -> EntryM ()
    breakPre t = do
      iforM_ (LTP.children1 t) $ \fc st -> do
        case LTP.splitPrefix . LTP.addPrefix [fc] $ st of
          (pfx, Nothing, st') -> do
              sbmn <- lift $ go st'
              ent . MEntry Nothing (T.pack pfx) Always Always $ mnAction sbmn
          (pfx, Just a, st') -> do
              ent . MEntry Nothing (T.pack pfx) Always Always $ a
              unless (LTP.null st') $ do
                breakPre . LTP.addPrefix pfx $ st'