{-| Module : PP.Template Description : Common behavior for defined templates Copyright : (c) 2017 Patrick Champion License : see LICENSE file Maintainer : chlablak@gmail.com Stability : provisional Portability : portable -} {-# LANGUAGE FlexibleInstances #-} module PP.Template ( Template(..) , mergeContext ) where import Text.StringTemplate -- |Type class for Templatable structure class Template context where -- |Put the context into StringTemplate attributes attributes :: context -> StringTemplate String -> StringTemplate String -- |Compile a template with a given context compile :: context -> String -> String compile c t = render $ attributes c $ newSTMP t -- |Merge two contexts together mergeContext :: (Template c1, Template c2) => c1 -> c2 -> (StringTemplate String -> StringTemplate String) mergeContext a b = attributes a . attributes b -- |Allow to use `compile` with `mergeContext` -- For example: `compile (mergeContext c1 c2) t` instance Template ((->) (StringTemplate String) (StringTemplate String)) where attributes = id