bake-0.4: src/Development/Bake/Pretty.hs
{-# LANGUAGE RecordWildCards, ViewPatterns #-}
module Development.Bake.Pretty(ovenPretty, ovenPrettyMerge, Pretty(..)) where
import Development.Bake.Core.Type
import Data.List.Extra
data Pretty a = Pretty String a deriving (Read,Show,Eq)
instance Stringy a => Stringy (Pretty a) where
stringyTo (Pretty a b) = a ++ "=" ++ stringyTo b
stringyFrom s = case breakOn "=" s of
(a,_:b) -> Pretty a $ stringyFrom b
_ -> Pretty "" $ stringyFrom s
stringyPretty (Pretty a b) = a ++ "=" ++ stringyPretty b
-- | Define an oven that allows @foo=...@ annotations to be added to the strings.
-- These can be used to annotate important information, e.g. instead of talking about
-- Git SHA1's, you can talk about @person=SHA1@ or @branch=SHA1@.
ovenPretty :: Oven state patch test -> Oven state (Pretty patch) test
ovenPretty oven@Oven{..} = oven
{ovenUpdate = \s ps -> ovenUpdate s (map unpretty ps)
,ovenPrepare = \s ps -> ovenPrepare s (map unpretty ps)
,ovenPatchExtra = \s p -> ovenPatchExtra s (fmap unpretty p)
,ovenSupersede = \p1 p2 -> ovenSupersede (unpretty p1) (unpretty p2)
}
where
unpretty :: Pretty a -> a
unpretty (Pretty _ x) = x
-- | An oven suitable for use with 'ovenPretty' that supersedes patches which have the same
-- pretty name.
ovenPrettyMerge :: Oven state (Pretty patch) test -> Oven state (Pretty patch) test
ovenPrettyMerge oven = oven
{ovenSupersede = \(Pretty p1 _) (Pretty p2 _) -> p1 == p2
}