{-# 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 }