packages feed

smh-0.1.3: src/Actions.hs

{-# OPTIONS_GHC -Wno-unused-do-bind #-}
{-# LANGUAGE OverloadedStrings #-}

module Actions where

import           Common               (Action, Focus (FList, FText),
                                       Focuser (FTrav), Mapping, Parser,
                                       foldMappings, lexeme, symbol,
                                       toTextUnsafe)
import           Control.Lens         ((%~), (&), (.~), (^..))
import           Control.Lens.Extras  (biplate)
import           Data.Char            (isAlphaNum)
import           Data.Functor         (($>))
import           Data.Text            (Text)
import qualified Data.Text            as T
import qualified Data.Text.IO         as TIO
import           Parsers              (parseMappings, stringLiteral)
import           Text.Megaparsec      (MonadParsec (label, notFollowedBy),
                                       choice, satisfy)
import           Text.Megaparsec.Char (string)

parseAction :: Parser Action
parseAction = label "valid action" $ choice
    [ symbol "get-tree" $> getTree
    , symbol "get" $> actionGet
    , parseActionOver
    , parseActionSet
    ]

actionGet :: Action
actionGet input (FTrav trav) = do
    let focus = FList $ FText input ^.. trav
    printFocus focus
  where
    printFocus (FText str) = TIO.putStrLn str
    printFocus (FList lst) = mapM_ printFocus lst

actionOver :: Mapping -> Action
actionOver mapping input (FTrav trav) = do
    let output = toTextUnsafe $ FText input & trav %~ mapping
    TIO.putStr output

parseActionOver :: Parser Action
parseActionOver = do
    lexeme $ string "over" >> notFollowedBy (satisfy isAlphaNum)
    mappings <- parseMappings
    let mapping = foldMappings mappings
    return $ actionOver mapping

actionSet :: Text -> Action
actionSet str input (FTrav trav) = do
    let output = toTextUnsafe $ FText input & trav . biplate .~ str
    TIO.putStrLn output

parseActionSet :: Parser Action
parseActionSet = do
    symbol "set"
    actionSet <$> stringLiteral

getTree :: Action
getTree input (FTrav trav) = do
    putStr $ show $ FText input ^.. trav