module Functions.Template ( Template(..) , makeTemplate , applyTemplate ) where import Types (IsFunction(..), Token) import DependencyGenerator (DepGenM, TokenableTo(..), toTupleToken, runFunction) import Data.Text (Text) import qualified Data.Text as T data Template = TemplateParts Text Text deriving (Eq, Show) data MakeTemplate = MakeTemplate deriving Show instance IsFunction MakeTemplate (Text, Text) Template where evalFunction MakeTemplate (t, c) = let (beforeContent, after) = T.breakOn c t afterContent = T.drop (T.length c) after in TemplateParts beforeContent afterContent makeTemplate :: (TokenableTo Text a, TokenableTo Text b) => a -> b -> DepGenM (Token Template) makeTemplate a b = runFunction MakeTemplate =<< toTupleToken a b data ApplyTemplate = ApplyTemplate deriving Show instance IsFunction ApplyTemplate (Template, Text) Text where evalFunction ApplyTemplate (TemplateParts beforeContent afterContent, t) = T.concat [beforeContent, t, afterContent] applyTemplate :: (TokenableTo Template a, TokenableTo Text b) => a -> b -> DepGenM (Token Text) applyTemplate a b = runFunction ApplyTemplate =<< toTupleToken a b