{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE StandaloneDeriving #-}
module Bio.Chain.Alignment.Type where
import Bio.Chain (ChainLike (..))
import Control.DeepSeq (NFData (..))
import Control.Lens (Index, IxValue)
import Data.Array.Unboxed (Ix, UArray)
import GHC.Generics (Generic (..))
type Scoring a b = a -> b -> Int
type SimpleGap = Int
type SimpleGap2 = (SimpleGap, SimpleGap)
data AffineGap = AffineGap { gapOpen :: Int
, gapExtend :: Int
}
deriving (Show, Eq, Generic, NFData)
type AffineGap2 = (AffineGap, AffineGap)
class IsGap a where
insertCostOpen :: a -> Int
insertCostExtend :: a -> Int
deleteCostOpen :: a -> Int
deleteCostExtend :: a -> Int
isAffine :: a -> Bool
isAffine x = insertCostOpen x /= insertCostExtend x || deleteCostOpen x /= deleteCostExtend x
instance IsGap SimpleGap where
insertCostOpen = id
insertCostExtend = id
deleteCostOpen = id
deleteCostExtend = id
instance IsGap SimpleGap2 where
insertCostOpen = fst
insertCostExtend = fst
deleteCostOpen = snd
deleteCostExtend = snd
instance IsGap AffineGap where
insertCostOpen = gapOpen
insertCostExtend = gapExtend
deleteCostOpen = gapOpen
deleteCostExtend = gapExtend
instance IsGap AffineGap2 where
insertCostOpen = gapOpen . fst
insertCostExtend = gapExtend . fst
deleteCostOpen = gapOpen . snd
deleteCostExtend = gapExtend . snd
data EditOp = Insert | Delete | Match
deriving (Show, Eq, Ord, Bounded, Enum, Ix, Generic, NFData)
data Operation i j = INSERT { getJ :: j }
| DELETE { getI :: i }
| MATCH { getI :: i, getJ :: j }
deriving (Show, Eq, Ord, Generic, NFData)
isInsert, isDelete, isMatch :: Operation i j -> Bool
isInsert INSERT{} = True
isInsert _ = False
isDelete DELETE{} = True
isDelete _ = False
isMatch MATCH{} = True
isMatch _ = False
type Matrix m m' = UArray (Index m, Index m', EditOp) Int
type Condition m m' = Matrix m m' -> m -> m' -> Index m -> Index m' -> Bool
data Conditions m m' = Conditions { isStop :: Condition m m'
, isDiag :: Condition m m'
, isVert :: Condition m m'
, isHoriz :: Condition m m'
}
data AlignmentResult m m' = AlignmentResult { score :: Int
, alignment :: [Operation (Index m) (Index m')]
, sequence1 :: m
, sequence2 :: m'
}
deriving (Generic)
instance (NFData a, NFData b) => NFData (UArray (a, b, EditOp) Int) where
rnf a = seq a ()
deriving instance (NFData a, NFData b, NFData (Index a), NFData (Index b))
=> NFData (AlignmentResult a b)
type Alignable m = (ChainLike m, Ix (Index m))
class SequenceAlignment (a :: * -> * -> *) where
semi :: a e1 e2 -> Bool
{-# INLINABLE semi #-}
semi = const False
cond :: (Alignable m, Alignable m') => a (IxValue m) (IxValue m') -> Conditions m m'
traceStart :: (Alignable m, Alignable m') => a (IxValue m) (IxValue m') -> Matrix m m' -> m -> m' -> (Index m, Index m')
scoreMatrix :: (Alignable m, Alignable m') => a (IxValue m) (IxValue m') -> m -> m' -> Matrix m m'