1
1
mirror of https://github.com/github/semantic.git synced 2024-12-27 17:05:33 +03:00
semantic/Diff.hs

64 lines
1.8 KiB
Haskell
Raw Normal View History

2015-11-18 00:25:36 +03:00
module Diff where
{-# LANGUAGE DeriveFunctor #-}
2015-11-18 00:35:55 +03:00
import Syntax
2015-11-18 00:25:36 +03:00
import Data.Maybe
2015-11-18 00:44:27 +03:00
import Data.Map
2015-11-18 00:35:52 +03:00
import Control.Monad.Free
2015-11-18 00:25:36 +03:00
newtype Fix f = In { out :: f (Fix f) }
data Cofree f a = Unroll a (f (Cofree f a))
deriving Functor
data Range = Range { start :: Int, end :: Int }
type Info = String
2015-11-18 00:32:14 +03:00
type Term a = Fix (Syntax a)
2015-11-18 00:25:36 +03:00
data Patch a = Patch { old :: Maybe a, new :: Maybe a }
2015-11-18 00:32:14 +03:00
type Diff a = Free (Syntax a) (Patch (Term a))
2015-11-18 00:25:36 +03:00
(</>) :: Maybe (Term a) -> Maybe (Term a) -> Diff a
(</>) a b = Pure $ Patch { old = a, new = b }
a :: Term String
2015-11-18 00:44:27 +03:00
a = In $ Keyed $ fromList [
2015-11-18 00:25:36 +03:00
("hello", In $ Indexed [ In $ Leaf "hi" ]),
("goodbye", In $ Leaf "goodbye") ]
b :: Term String
2015-11-18 00:44:27 +03:00
b = In $ Keyed $ fromList [
2015-11-18 00:25:36 +03:00
("hello", In $ Indexed []),
("goodbye", In $ Indexed []) ]
d :: Diff String
2015-11-18 00:44:27 +03:00
d = Free $ Keyed $ fromList [
2015-11-18 00:40:19 +03:00
("hello", Free $ Indexed [ Just (In $ Leaf "hi") </> Nothing ]),
2015-11-18 00:25:36 +03:00
("goodbye", Just (In $ Leaf "goodbye") </> Just (In $ Indexed [])) ]
data Operation a f
= Recur (Term a) (Term a) (Diff a -> f)
| ByKey [(String, Term a)] [(String, Term a)] ([(String, Diff a)] -> f)
| ByIndex [Term a] [Term a] ([Diff a] -> f)
type Algorithm a = Free (Operation a)
cost :: Diff a -> Integer
cost f = iter c $ fmap g f where
c (Leaf _) = 0
2015-11-18 00:56:40 +03:00
c (Keyed xs) = sum $ snd <$> (toList xs)
2015-11-18 00:25:36 +03:00
c (Indexed xs) = sum xs
2015-11-18 00:46:23 +03:00
c (Fixed xs) = sum xs
2015-11-18 00:25:36 +03:00
g _ = 1
-- interpret :: Algorithm a b -> b
-- interpret (Pure b) = b
2015-11-18 00:40:19 +03:00
-- interpret (Free (Recur a b f)) = f $ Pure (Patch { old = Just (In a), new = Just (In b) })
2015-11-18 00:25:36 +03:00
2015-11-18 00:32:14 +03:00
type RangedTerm a = Cofree (Syntax a) Int
-- data Difff a f = Difff (Either (Patch (Term a)) (Syntax a f))
2015-11-18 00:25:36 +03:00
-- type RangedDiff a = Cofree (Difff a) Range
2015-11-18 00:32:14 +03:00
data AnnotatedSyntax a f = AnnotatedSyntax (Range, Syntax a f)
type RangedDiff a = Free (AnnotatedSyntax a) (Patch (Term a))