{-# OPTIONS_GHC -fno-warn-orphans #-}
module Darcs.Patch.V3 ( RepoPatchV3 ) where

import Darcs.Prelude

import Darcs.Patch.FromPrim ( FromPrim(..) )
import Darcs.Patch.Prim.Named
  ( PrimPatchId
  , anonymousNamedPrim, namedPrim, positivePrimPatchIds
  )
import Darcs.Patch.Witnesses.Ordered ( FL(..) )
import qualified Darcs.Patch.V3.Core as Core ( RepoPatchV3(..) )
import Darcs.Patch.V3.Resolution ()

type RepoPatchV3 = Core.RepoPatchV3 PrimPatchId

-- This instance is specialised to PrimPatchId because it is dependent
-- on the relationship between PatchInfo and PrimPatchId
instance FromPrim (RepoPatchV3 prim) where
  fromAnonymousPrim = Core.Prim . anonymousNamedPrim
  fromPrim pid p = Core.Prim (namedPrim pid p)
  fromPrims = go . positivePrimPatchIds
    where
      go :: [PrimPatchId] -> FL prim wX wY -> FL (RepoPatchV3 prim) wX wY
      go _ NilFL = NilFL
      go (pid:pids) (p:>:ps) = fromPrim pid p :>: go pids ps
      go [] _ = error "positivePrimPatchIds should return an infinite list"
