module Data.FuzzySet.Types
    ( FuzzySetItem(..)
    , GramInfo(..)
    , FuzzySet(..)
    ) where

import Data.HashMap.Strict (HashMap)
import Data.Vector (Vector)
import Data.Text (Text)


data FuzzySetItem = FuzzySetItem
    { vectorMagnitude :: !Double
    , normalizedEntry :: !Text
    } deriving (Eq, Show)


data GramInfo = GramInfo
    { itemIndex :: !Int
    , gramCount :: !Int
    } deriving (Eq, Show)


-- | Main fuzzy string set data type. Use 'Data.FuzzySet.emptySet',
-- 'Data.FuzzySet.defaultSet', or 'Data.FuzzySet.fromList' to create sets.
--
data FuzzySet = FuzzySet
    { exactSet       :: !(HashMap Text Text)
    , matchDict      :: !(HashMap Text [GramInfo])
    , items          :: !(HashMap Int (Vector FuzzySetItem))
    , gramSizeLower  :: !Int
    , gramSizeUpper  :: !Int
    , useLevenshtein :: !Bool
    } deriving (Eq, Show)