Advertisement
Guest User

Untitled

a guest
Apr 22nd, 2019
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. {-# LANGUAGE FlexibleContexts #-}
  2. module Substitutor
  3.        ( substitute
  4.        ) where
  5.  
  6.  
  7. import Data.Map (Map, empty, insert, findWithDefault)
  8. import Control.Monad (liftM2)
  9. import Control.Monad.State (MonadState, get, modify, gets)
  10. import Control.Monad.Except (MonadError)
  11. import Token
  12. import Action
  13. import Exception
  14.  
  15.  
  16. substituteOne :: ( MonadState (Map String String)  m
  17.                  , MonadError Exception m
  18.                  ) => Token -> [String] -> m String
  19. substituteOne (Simple s) _ = return s
  20. substituteOne (NumArgument n) args = return (args !! (fromIntegral n))
  21. substituteOne (VarArgument name) _ = gets $ findWithDefault "" name
  22. substituteOne _ _ = undefined
  23.  
  24. adder :: Bool -> String -> [String] -> [String]
  25. adder _ s [] = [s]
  26. adder b s l@(h : t) = if b then (s ++ h) : t
  27.                     else s : l
  28.  
  29. substitute :: ( MonadState (Map String String)  m
  30.               , MonadError Exception m
  31.               ) => [TokenWithConcat] -> [String] -> m [String]
  32. substitute [] _ = return []
  33. substitute ((TokenWithConcat token c) : t) args = liftM2 (adder c) (substituteOne token args) (substitute t args)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement