module Darcs.Patch.Format
    ( PatchListFormat(..), ListFormat(..)
    , FileNameFormat(..) )

#include "gadts.h"

-- | Showing and reading lists of patches This class allows us to control how
-- lists of patches are formatted on disk. For legacy reasons V1 patches have
-- their own special treatment (see 'ListFormat'). Other patch types use the
-- default format which just puts them in a sequence without separators or any
-- prelude/epilogue.
-- This means that 'FL (FL p)' etc would be ambiguous, so there are no instances
-- for 'FL p' or other list types.
class PatchListFormat p where
  patchListFormat :: ListFormat p
  patchListFormat = ListFormatDefault

-- | This type is used to tweak the way that lists of 'p' are shown for a given
-- 'Patch' type 'p'. It is needed to maintain backwards compatibility for V1 and
-- V2 patches.
data ListFormat (p :: PATCHKIND)
  = ListFormatDefault -- ^ Show and read lists without braces.
  | ListFormatV1      -- ^ Show lists with a single layer of braces around the outside,
                      -- except for singletons which have no braces.
                      -- Read with arbitrary nested braces and parens and flatten them out.
  | ListFormatV2      -- ^ Show lists without braces
                      -- Read with arbitrary nested parens and flatten them out.

data FileNameFormat = OldFormat
                    | NewFormat