1
1
mirror of https://github.com/github/semantic.git synced 2024-12-25 16:02:43 +03:00
semantic/src/Algorithm.hs

31 lines
1.2 KiB
Haskell
Raw Normal View History

2015-11-18 03:20:52 +03:00
module Algorithm where
2015-11-18 03:24:01 +03:00
import Control.Monad.Free.Church
2016-08-04 01:12:31 +03:00
import Diff
import Prologue
import Term
-- | A single step in a diffing algorithm.
data AlgorithmF
term -- ^ The type of terms.
diff -- ^ The type of diffs.
2016-08-04 01:12:31 +03:00
f -- ^ The type representing another level of the diffing algorithm. Often Algorithm.
-- | Recursively diff two terms and pass the result to the continuation.
= Recursive term term (diff -> f)
2016-08-04 01:12:31 +03:00
-- | Diff two arrays and pass the result to the continuation.
| ByIndex [term] [term] ([diff] -> f)
| ByRandomWalkSimilarity [term] [term] ([diff] -> f)
2016-08-04 01:12:31 +03:00
deriving Functor
2015-11-18 03:24:01 +03:00
2016-02-03 18:28:44 +03:00
-- | A lazily-produced AST for diffing.
type Algorithm term diff = F (AlgorithmF term diff)
recursively :: Term leaf annotation -> Term leaf annotation -> Algorithm (Term leaf annotation) (Diff leaf annotation) (Diff leaf annotation)
recursively a b = wrap (Recursive a b pure)
byIndex :: [Term leaf annotation] -> [Term leaf annotation] -> Algorithm (Term leaf annotation) (Diff leaf annotation) [Diff leaf annotation]
byIndex a b = wrap (ByIndex a b pure)
2016-08-04 01:40:17 +03:00
bySimilarity :: [Term leaf annotation] -> [Term leaf annotation] -> Algorithm (Term leaf annotation) (Diff leaf annotation) [Diff leaf annotation]
2016-08-04 01:40:17 +03:00
bySimilarity a b = wrap (ByRandomWalkSimilarity a b pure)