1
1
mirror of https://github.com/github/semantic.git synced 2024-12-21 13:51:44 +03:00
semantic/src/Diff.hs

25 lines
893 B
Haskell
Raw Normal View History

{-# LANGUAGE TypeFamilies, TypeSynonymInstances #-}
2015-11-18 00:25:36 +03:00
module Diff where
import Prologue
2016-05-03 22:50:38 +03:00
import Data.Functor.Foldable as Foldable
import Data.Functor.Both
2015-11-18 05:23:53 +03:00
import Patch
2016-02-29 18:04:59 +03:00
import Syntax
import Term
2015-11-18 00:25:36 +03:00
2016-01-14 20:30:21 +03:00
-- | An annotated series of patches of terms.
2016-06-01 03:16:19 +03:00
type DiffF leaf annotation = FreeF (CofreeF (Syntax leaf) (Both annotation)) (Patch (Term leaf annotation))
2016-05-03 21:10:25 +03:00
type Diff a annotation = Free (CofreeF (Syntax a) (Both annotation)) (Patch (Term a annotation))
2016-05-03 22:50:38 +03:00
2016-05-04 21:37:24 +03:00
type instance Base (Free f a) = FreeF f a
2016-05-27 20:10:04 +03:00
instance (Functor f) => Recursive (Free f a) where project = runFree
instance (Functor f) => Corecursive (Free f a) where embed = free
2015-11-18 00:25:36 +03:00
2015-12-01 03:06:48 +03:00
diffSum :: (Patch (Term a annotation) -> Integer) -> Diff a annotation -> Integer
2015-12-01 18:13:05 +03:00
diffSum patchCost diff = sum $ fmap patchCost diff
2015-12-01 03:06:48 +03:00
2016-04-11 22:06:59 +03:00
-- | The sum of the node count of the diffs patches.
2015-11-27 20:06:14 +03:00
diffCost :: Diff a annotation -> Integer
2015-12-01 03:16:22 +03:00
diffCost = diffSum $ patchSum termSize