{-# OPTIONS_GHC -Wno-orphans #-}
{-# LANGUAGE UndecidableInstances #-}
module Darcs.Test.Patch.Arbitrary.RepoPatchV2 () where

import Darcs.Prelude

import Control.Exception
import System.IO.Unsafe

import Darcs.Test.Patch.Arbitrary.Generic
    ( ArbitraryPrim
    , MightHaveDuplicate(..)
    , PrimBased(..)
    )
import Darcs.Test.Patch.Arbitrary.RepoPatch
import Darcs.Test.Patch.Merge.Checked ( CheckedMerge(..) )
import Darcs.Test.Patch.RepoModel ( RepoState, ModelOf )
import Darcs.Test.Patch.WithState ( PropagateShrink )
import Darcs.Patch
import Darcs.Patch.V2 ( RepoPatchV2 )
import Darcs.Patch.V2.RepoPatch ( isDuplicate, RepoPatchV2(Normal) )
import Darcs.Patch.Witnesses.Ordered

instance MightHaveDuplicate (RepoPatchV2 prim) where
  hasDuplicate = isDuplicate

type instance ModelOf (RepoPatchV2 prim) = ModelOf prim

instance ( ArbitraryPrim prim
         , PrimPatch prim
         , ApplyState prim ~ RepoState (ModelOf prim)
         ) =>
         ArbitraryRepoPatch (RepoPatchV2 prim) where
  notRepoPatchV1 = Just (NotRepoPatchV1 (\case {}))

instance PrimPatch prim => CheckedMerge (RepoPatchV2 prim) where
  validateMerge v =
    case unsafePerformIO (try (evaluate v)) of
      Left (_ :: SomeException) -> Nothing
      Right x -> Just x

instance (PrimPatch prim, ArbitraryPrim prim, PropagateShrink prim prim) =>
         PrimBased (RepoPatchV2 prim) where
  type OnlyPrim (RepoPatchV2 prim) = prim
  primEffect = (:>: NilFL)
  liftFromPrim = Normal