talash-0.3.0: src/Talash/ScoredMatch.hs
-- |
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE MultiParamTypeClasses #-}
module Talash.ScoredMatch (ChunkIndex (..) , ScoredMatchSized (..) , emptyMatch) where
import Talash.Intro
import Data.Vector.Unboxed.Deriving
import GHC.TypeNats
import qualified Data.Vector.Unboxed.Sized as S
data ChunkIndex = ChunkIndex {number :: {-# UNPACK #-} !Int , index :: {-# UNPACK #-} !Int} deriving (Eq , Ord , Show)
derivingUnbox "ChunkIndex"
[t| ChunkIndex -> (Int , Int) |]
[|\(ChunkIndex i j) -> (i,j)|]
[|\(i,j) -> ChunkIndex i j|]
data ScoredMatchSized (n::Nat) = ScoredMatchSized { score :: {-# UNPACK #-} !(Down Int), chunkIndex :: {-# UNPACK #-} !ChunkIndex
, matchData :: {-# UNPACK #-} !(S.Vector n Int)} deriving (Show)
derivingUnbox "ScoredMatchSized"
[t| forall (n::Nat). KnownNat n => ScoredMatchSized n -> (Int , Int , Int , S.Vector n Int) |]
[| \(ScoredMatchSized (Down s) (ChunkIndex i j) m) -> (s, i , j , m) |]
[| \(s, i , j , m) -> ScoredMatchSized (Down s) (ChunkIndex i j) m |]
instance Eq (ScoredMatchSized n) where
(ScoredMatchSized s i _) == (ScoredMatchSized t j _) = s == t && i == j
instance Ord (ScoredMatchSized n) where
compare (ScoredMatchSized s i _) (ScoredMatchSized t j _) = compare (s,i) (t,j)
emptyMatch :: Int -> Int -> ScoredMatchSized 0
emptyMatch i j = ScoredMatchSized 0 (ChunkIndex i j) S.empty