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