content: module Data.HDiff.Diff.Types where
  
  import qualified Data.WordTrie as T
  
  -- |Diffing Algorithm modes. This is better illustrated with an
  -- example. Supposte we have the following source and destination
  -- trees:
  --
  -- > src = Bin (Bin t k) u
  -- > dst = Bin (Bin t k) t
  --
  data DiffMode
    -- |The /proper share/ algorithm will only share the trees that are
    -- supposed to be a proper share. With the src and dst above,
    -- it will produce:
    --
    -- > diff src dst = Bin (Bin 0 1) u |-> Bin (Bin 0 1) 0
    --
    -- A good intuition is that this approach will prefer maximum sharing
    -- as opposed to sharing bigger trees.
    = DM_ProperShare
    -- |The first algoritm we produced. Does not share nested trees. In fact,
    -- with this mode we will get the following result:
    --
    -- > diff src dst = Bin 0 u |-> Bin 0 t
    | DM_NoNested
    -- |Similar to @git --patience@, we share only unique trees.
    -- In this example, this would result in the same as 'DM_NoNested',
    -- but if we take @u = (Bin t k)@, no sharing would be performed
    -- whatsoever.
    | DM_Patience
    deriving (Eq , Show , Enum)
  
  -- |Specifies the options for the diffing algorithm
  data DiffOptions = DiffOptions
    -- ^ Minimum height of trees considered for sharing
    { doMinHeight      :: Int
    -- ^ Context extraction mode
    , doMode           :: DiffMode
    -- ^ Should we skip change minimization and closures?
    , doGlobalChgs     :: Bool
    } deriving (Eq , Show)
  
  diffOptionsDefault :: DiffOptions
  diffOptionsDefault = DiffOptions 1 DM_NoNested False
  
  -- |The data structure that captures which subtrees are shared
  --  between source and destination. Besides providing an efficient
  --  answer to the query: "is this tree shared?", it also gives a
  --  unique identifier to that tree, allowing us to easily
  --  build our n-holed treefix.
  type IsSharedMap = T.Trie MetavarAndArity
  
  data MetavarAndArity = MAA { getMetavar :: Int , getArity :: Int }
    deriving (Eq , Show)
  
  -- |A tree smaller than the minimum height will never be shared.
  type MinHeight = Int
  