module Darcs.Patch.Set
( PatchSet(..)
, Tagged(..)
, SealedPatchSet
, Origin
, progressPatchSet
, tags
, emptyPatchSet
, appendPSFL
, patchSet2RL
, patchSet2FL
, patchSetfMap
) where
import Prelude ()
import Darcs.Prelude
import Darcs.Patch.Info ( PatchInfo )
import Darcs.Patch.PatchInfoAnd ( PatchInfoAnd, info )
import Darcs.Patch.Witnesses.Sealed ( Sealed )
import Darcs.Patch.Witnesses.Ordered
( FL, RL(..), (+<+), reverseFL, reverseRL,
mapRL_RL, concatRL, mapRL )
import Darcs.Patch.Witnesses.Show ( Show1(..), Show2(..), ShowDict(ShowDictClass) )
import Darcs.Util.Progress ( progress )
data Origin
type SealedPatchSet rt p wStart = Sealed ((PatchSet rt p) wStart)
data PatchSet rt p wStart wY where
PatchSet :: RL (Tagged rt p) wStart wX -> RL (PatchInfoAnd rt p) wX wY
-> PatchSet rt p wStart wY
deriving instance Show2 p => Show (PatchSet rt p wStart wY)
instance Show2 p => Show1 (PatchSet rt p wStart) where
showDict1 = ShowDictClass
instance Show2 p => Show2 (PatchSet rt p) where
showDict2 = ShowDictClass
emptyPatchSet :: PatchSet rt p wX wX
emptyPatchSet = PatchSet NilRL NilRL
data Tagged rt p wX wZ where
Tagged :: PatchInfoAnd rt p wY wZ -> Maybe String
-> RL (PatchInfoAnd rt p) wX wY -> Tagged rt p wX wZ
deriving instance Show2 p => Show (Tagged rt p wX wZ)
instance Show2 p => Show1 (Tagged rt p wX) where
showDict1 = ShowDictClass
instance Show2 p => Show2 (Tagged rt p) where
showDict2 = ShowDictClass
patchSet2RL :: PatchSet rt p wStart wX -> RL (PatchInfoAnd rt p) wStart wX
patchSet2RL (PatchSet ts ps) = concatRL (mapRL_RL ts2rl ts) +<+ ps
where
ts2rl :: Tagged rt p wY wZ -> RL (PatchInfoAnd rt p) wY wZ
ts2rl (Tagged t _ ps2) = ps2 :<: t
patchSet2FL :: PatchSet rt p wStart wX -> FL (PatchInfoAnd rt p) wStart wX
patchSet2FL = reverseRL . patchSet2RL
appendPSFL :: PatchSet rt p wStart wX -> FL (PatchInfoAnd rt p) wX wY
-> PatchSet rt p wStart wY
appendPSFL (PatchSet ts ps) newps = PatchSet ts (ps +<+ reverseFL newps)
progressPatchSet :: String -> PatchSet rt p wStart wX -> PatchSet rt p wStart wX
progressPatchSet k (PatchSet ts ps) =
PatchSet (mapRL_RL progressTagged ts) (mapRL_RL prog ps)
where
prog = progress k
progressTagged :: Tagged rt p wY wZ -> Tagged rt p wY wZ
progressTagged (Tagged t h tps) = Tagged (prog t) h (mapRL_RL prog tps)
tags :: PatchSet rt p wStart wX -> [PatchInfo]
tags (PatchSet ts _) = mapRL taggedTagInfo ts
where
taggedTagInfo :: Tagged rt p wY wZ -> PatchInfo
taggedTagInfo (Tagged t _ _) = info t
patchSetfMap:: (forall wW wZ . PatchInfoAnd rt p wW wZ -> IO a) -> PatchSet rt p wW' wZ' -> IO [a]
patchSetfMap f = sequence . mapRL f . patchSet2RL