b9-0.5.62: src/lib/B9/Artifact/Content.hs
-- | Content is what is written to files in the generated VM images and cloud configuration.
--
-- Contains the monadic actions that generate the content that
-- is written to the generated artifacts.
--
-- @since 0.5.62
module B9.Artifact.Content
( ContentGeneratorT(MkContentGeneratorT)
, ContentGenerator
, ByteStringGenerator
, renderContentGenerator
, ToContentGenerator (..)
) where
import B9.B9Monad (B9)
import B9.Environment
import Control.Applicative (Alternative)
import Control.Monad.Reader
import Data.ByteString.Lazy as Lazy
-- | A monadic action that generates content by using the 'Environment'
-- as additional input, e.g. when interpolating string templates.
--
-- Most intersting is the fact the 'Semigroup' and 'Monoid' instances
-- are available.
--
-- @since 0.5.62
newtype ContentGeneratorT m a = MkContentGeneratorT
{ getContentGenerator :: EnvironmentReaderT m a
} deriving (MonadTrans, Alternative, MonadReader Environment, MonadIO, Monad, Applicative, Functor)
-- | A 'B9' action that generates content by using the 'Environment'
-- as additional input, e.g. when interpolating string templates.
--
-- @since 0.5.62
type ContentGenerator a = ContentGeneratorT B9 a
-- | A 'B9' action that procuces a 'Lazy.ByteString'.
--
-- @since 0.5.62
type ByteStringGenerator = ContentGenerator Lazy.ByteString
instance (Monad m, Semigroup a) => Semigroup (ContentGeneratorT m a) where
l <> r = (<>) <$> l <*> r
instance (Monad m, Monoid a) => Monoid (ContentGeneratorT m a) where
mempty = pure mempty
-- | Types whose values can be turned into a 'ContentGenerator'
--
-- @since 0.5.62
class ToContentGenerator c where
toContentGenerator :: c -> ByteStringGenerator
-- | Execute a 'ContentGenerator'.
-- The 'Environment' contains the bindings of any string template variables.
--
-- @since 0.5.62
renderContentGenerator :: Environment -> ContentGenerator a -> B9 a
renderContentGenerator e = runEnvironmentReaderT e . getContentGenerator