hdiff-0.0.0: src/Languages/RTree/Diff.hs
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE TypeApplications #-}
module Languages.RTree.Diff where
import Data.Functor.Const
import Data.Void
import Generics.MRSOP.Base
import Generics.MRSOP.Holes
import Generics.MRSOP.HDiff.Digest
import Languages.RTree
import Data.HDiff.Patch
import Data.HDiff.Change
import Data.HDiff.Diff
import Data.HDiff.Diff.Preprocess
type PatchRTree = Patch W CodesRTree 'Z
rbin :: RTree -> RTree -> RTree
rbin l r = "bin" :>: [l , r]
rlf :: String -> RTree
rlf = (:>: [])
x1 , y1 :: RTree
x1 = rbin (rbin (rlf "t") (rbin (rlf "u") (rlf "f"))) (rlf "k")
y1 = rbin (rbin (rlf "t") (rbin (rlf "u") (rlf "f"))) (rlf "t")
digemRTreeH :: Int -> RTree -> RTree -> PatchRTree
digemRTreeH h a b = diff h (dfrom $ into @FamRTree a)
(dfrom $ into @FamRTree b)
digemRTreeHM :: DiffMode -> Int -> RTree -> RTree -> PatchRTree
digemRTreeHM m h a b = diffOpts (diffOptionsDefault { doMode = m
, doMinHeight = h
, doOpaqueHandling = DO_OnSpine })
(dfrom $ into @FamRTree a)
(dfrom $ into @FamRTree b)
rtreeMerkle :: RTree -> Digest
rtreeMerkle a = getDig $ preprocess (na2holes $ NA_I $ dfrom $ into @FamRTree a)
where
getDig :: PrepFix a ki codes (Const Void) ix -> Digest
getDig = treeDigest . getConst . holesAnn
digemRTree :: RTree -> RTree -> PatchRTree
digemRTree a b = diff 1 (dfrom $ into @FamRTree a)
(dfrom $ into @FamRTree b)
applyRTree :: PatchRTree -> RTree -> Either String RTree
applyRTree p x = either Left (Right . unEl . dto @'Z . unFix)
$ apply p (dfrom $ into @FamRTree x)
applyRTreeC :: CChange W CodesRTree ('I 'Z) -> RTree -> Either String RTree
applyRTreeC p x = applyRTree (Hole' p) x
applyRTree' :: PatchRTree -> RTree -> Maybe RTree
applyRTree' p = either (const Nothing) Just . applyRTree p