{-# OPTIONS_GHC -fno-warn-unrecognised-pragmas #-}
module Darcs.Patch.Effect ( Effect(..) ) where

import Prelude ()
import Darcs.Prelude

import Darcs.Patch.Prim.Class ( PrimOf )

import Darcs.Patch.Witnesses.Ordered
    ( FL(..), RL(..), reverseFL, reverseRL
    , concatFL, concatRL, mapFL_FL, mapRL_RL
    )


-- | Patches whose concrete effect which can be expressed as a list of
--   primitive patches.
--
--   A minimal definition would be either of @effect@ or @effectRL@.
class Effect p where
    effect :: p wX wY -> FL (PrimOf p) wX wY
    effect = RL (PrimOf p) wX wY -> FL (PrimOf p) wX wY
forall (a :: * -> * -> *) wX wZ. RL a wX wZ -> FL a wX wZ
reverseRL (RL (PrimOf p) wX wY -> FL (PrimOf p) wX wY)
-> (p wX wY -> RL (PrimOf p) wX wY)
-> p wX wY
-> FL (PrimOf p) wX wY
forall b c a. (b -> c) -> (a -> b) -> a -> c
. p wX wY -> RL (PrimOf p) wX wY
forall (p :: * -> * -> *) wX wY.
Effect p =>
p wX wY -> RL (PrimOf p) wX wY
effectRL
    effectRL :: p wX wY -> RL (PrimOf p) wX wY
    effectRL = FL (PrimOf p) wX wY -> RL (PrimOf p) wX wY
forall (a :: * -> * -> *) wX wZ. FL a wX wZ -> RL a wX wZ
reverseFL (FL (PrimOf p) wX wY -> RL (PrimOf p) wX wY)
-> (p wX wY -> FL (PrimOf p) wX wY)
-> p wX wY
-> RL (PrimOf p) wX wY
forall b c a. (b -> c) -> (a -> b) -> a -> c
. p wX wY -> FL (PrimOf p) wX wY
forall (p :: * -> * -> *) wX wY.
Effect p =>
p wX wY -> FL (PrimOf p) wX wY
effect
    {-# MINIMAL effect | effectRL #-}

instance Effect p => Effect (FL p) where
    effect :: FL p wX wY -> FL (PrimOf (FL p)) wX wY
effect p :: FL p wX wY
p = FL (FL (PrimOf p)) wX wY -> FL (PrimOf (FL p)) wX wY
forall (a :: * -> * -> *) wX wZ. FL (FL a) wX wZ -> FL a wX wZ
concatFL (FL (FL (PrimOf p)) wX wY -> FL (PrimOf (FL p)) wX wY)
-> FL (FL (PrimOf p)) wX wY -> FL (PrimOf (FL p)) wX wY
forall a b. (a -> b) -> a -> b
$ (forall wW wY. p wW wY -> FL (PrimOf p) wW wY)
-> FL p wX wY -> FL (FL (PrimOf p)) wX wY
forall (a :: * -> * -> *) (b :: * -> * -> *) wX wZ.
(forall wW wY. a wW wY -> b wW wY) -> FL a wX wZ -> FL b wX wZ
mapFL_FL forall wW wY. p wW wY -> FL (PrimOf p) wW wY
forall (p :: * -> * -> *) wX wY.
Effect p =>
p wX wY -> FL (PrimOf p) wX wY
effect FL p wX wY
p
    effectRL :: FL p wX wY -> RL (PrimOf (FL p)) wX wY
effectRL p :: FL p wX wY
p = RL (RL (PrimOf p)) wX wY -> RL (PrimOf (FL p)) wX wY
forall (a :: * -> * -> *) wX wZ. RL (RL a) wX wZ -> RL a wX wZ
concatRL (RL (RL (PrimOf p)) wX wY -> RL (PrimOf (FL p)) wX wY)
-> RL (RL (PrimOf p)) wX wY -> RL (PrimOf (FL p)) wX wY
forall a b. (a -> b) -> a -> b
$ (forall wW wY. p wW wY -> RL (PrimOf p) wW wY)
-> RL p wX wY -> RL (RL (PrimOf p)) wX wY
forall (a :: * -> * -> *) (b :: * -> * -> *) wX wZ.
(forall wW wY. a wW wY -> b wW wY) -> RL a wX wZ -> RL b wX wZ
mapRL_RL forall wW wY. p wW wY -> RL (PrimOf p) wW wY
forall (p :: * -> * -> *) wX wY.
Effect p =>
p wX wY -> RL (PrimOf p) wX wY
effectRL (RL p wX wY -> RL (RL (PrimOf p)) wX wY)
-> RL p wX wY -> RL (RL (PrimOf p)) wX wY
forall a b. (a -> b) -> a -> b
$ FL p wX wY -> RL p wX wY
forall (a :: * -> * -> *) wX wZ. FL a wX wZ -> RL a wX wZ
reverseFL FL p wX wY
p

instance Effect p => Effect (RL p) where
    effect :: RL p wX wY -> FL (PrimOf (RL p)) wX wY
effect p :: RL p wX wY
p = FL (FL (PrimOf p)) wX wY -> FL (PrimOf (RL p)) wX wY
forall (a :: * -> * -> *) wX wZ. FL (FL a) wX wZ -> FL a wX wZ
concatFL (FL (FL (PrimOf p)) wX wY -> FL (PrimOf (RL p)) wX wY)
-> FL (FL (PrimOf p)) wX wY -> FL (PrimOf (RL p)) wX wY
forall a b. (a -> b) -> a -> b
$ (forall wW wY. p wW wY -> FL (PrimOf p) wW wY)
-> FL p wX wY -> FL (FL (PrimOf p)) wX wY
forall (a :: * -> * -> *) (b :: * -> * -> *) wX wZ.
(forall wW wY. a wW wY -> b wW wY) -> FL a wX wZ -> FL b wX wZ
mapFL_FL forall wW wY. p wW wY -> FL (PrimOf p) wW wY
forall (p :: * -> * -> *) wX wY.
Effect p =>
p wX wY -> FL (PrimOf p) wX wY
effect (FL p wX wY -> FL (FL (PrimOf p)) wX wY)
-> FL p wX wY -> FL (FL (PrimOf p)) wX wY
forall a b. (a -> b) -> a -> b
$ RL p wX wY -> FL p wX wY
forall (a :: * -> * -> *) wX wZ. RL a wX wZ -> FL a wX wZ
reverseRL RL p wX wY
p
    effectRL :: RL p wX wY -> RL (PrimOf (RL p)) wX wY
effectRL p :: RL p wX wY
p = RL (RL (PrimOf p)) wX wY -> RL (PrimOf (RL p)) wX wY
forall (a :: * -> * -> *) wX wZ. RL (RL a) wX wZ -> RL a wX wZ
concatRL (RL (RL (PrimOf p)) wX wY -> RL (PrimOf (RL p)) wX wY)
-> RL (RL (PrimOf p)) wX wY -> RL (PrimOf (RL p)) wX wY
forall a b. (a -> b) -> a -> b
$ (forall wW wY. p wW wY -> RL (PrimOf p) wW wY)
-> RL p wX wY -> RL (RL (PrimOf p)) wX wY
forall (a :: * -> * -> *) (b :: * -> * -> *) wX wZ.
(forall wW wY. a wW wY -> b wW wY) -> RL a wX wZ -> RL b wX wZ
mapRL_RL forall wW wY. p wW wY -> RL (PrimOf p) wW wY
forall (p :: * -> * -> *) wX wY.
Effect p =>
p wX wY -> RL (PrimOf p) wX wY
effectRL RL p wX wY
p