Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- {-# LANGUAGE FlexibleContexts #-}
- module Substitutor
- ( substitute
- ) where
- import Data.Map (Map, empty, insert, findWithDefault)
- import Control.Monad (liftM2)
- import Control.Monad.State (MonadState, get, modify, gets)
- import Control.Monad.Except (MonadError)
- import Token
- import Action
- import Exception
- substituteOne :: ( MonadState (Map String String) m
- , MonadError Exception m
- ) => Token -> [String] -> m String
- substituteOne (Simple s) _ = return s
- substituteOne (NumArgument n) args = return (args !! (fromIntegral n))
- substituteOne (VarArgument name) _ = gets $ findWithDefault "" name
- substituteOne _ _ = undefined
- adder :: Bool -> String -> [String] -> [String]
- adder _ s [] = [s]
- adder b s l@(h : t) = if b then (s ++ h) : t
- else s : l
- substitute :: ( MonadState (Map String String) m
- , MonadError Exception m
- ) => [TokenWithConcat] -> [String] -> m [String]
- substitute [] _ = return []
- 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