module Data.CRF.Chain2.Generic.Internal
(
X (_unX, _unR)
, Xs
, mkX
, unX
, unR
, Y (_unY)
, Ys
, mkY
, unY
, lbAt
, lbOn
, lbNum
, lbIxs
, FeatIx (..)
, LbIx
, AVec (unAVec)
, mkAVec
, AVec2 (unAVec2)
, mkAVec2
) where
import Data.Binary (Binary)
import qualified Data.Set as S
import qualified Data.Map as M
import qualified Data.Array.Unboxed as A
import qualified Data.Vector as V
import qualified Data.Vector.Unboxed as U
import qualified Data.Vector.Generic.Base as G
import qualified Data.Vector.Generic.Mutable as G
type LbIx = Int
newtype AVec a = AVec { unAVec :: V.Vector a }
deriving (Show, Eq, Ord)
mkAVec :: Ord a => [a] -> AVec a
mkAVec = AVec . V.fromList . S.toAscList . S.fromList
newtype AVec2 a b = AVec2 { unAVec2 :: V.Vector (a, b) }
deriving (Show, Eq, Ord)
mkAVec2 :: Ord a => [(a, b)] -> AVec2 a b
mkAVec2 = AVec2 . V.fromList . M.toAscList . M.fromList
data X o t = X {
_unX :: AVec o
, _unR :: AVec t }
deriving (Show, Eq, Ord)
type Xs o t = V.Vector (X o t)
mkX :: (Ord o, Ord t) => [o] -> [t] -> X o t
mkX x r = X (mkAVec x) (mkAVec r)
unX :: X o t -> [o]
unX = V.toList . unAVec . _unX
unR :: X o t -> [t]
unR = V.toList . unAVec . _unR
newtype Y t = Y { _unY :: AVec2 t Double }
deriving (Show, Eq, Ord)
mkY :: Ord t => [(t, Double)] -> Y t
mkY = Y . mkAVec2
unY :: Y t -> [(t, Double)]
unY = V.toList . unAVec2 . _unY
type Ys t = V.Vector (Y t)
lbAt :: X o t -> LbIx -> t
lbAt x = (unAVec (_unR x) V.!)
lbVec :: Xs o t -> Int -> AVec t
lbVec xs = _unR . (xs V.!)
lbNumI :: Xs o t -> Int -> Int
lbNumI xs = V.length . unAVec . lbVec xs
lbOnI :: Xs o t -> Int -> LbIx -> t
lbOnI xs = (V.!) . unAVec . lbVec xs
lbIxsI :: Xs o t -> Int -> [LbIx]
lbIxsI xs i = [0 .. lbNum xs i 1]
lbNum :: Xs o t -> Int -> Int
lbNum xs i
| i < 0 || i >= n = 1
| otherwise = lbNumI xs i
where
n = V.length xs
lbOn :: Xs o t -> Int -> LbIx -> Maybe t
lbOn xs i
| i < 0 || i >= n = const Nothing
| otherwise = Just . lbOnI xs i
where
n = V.length xs
lbIxs :: Xs o t -> Int -> [LbIx]
lbIxs xs i
| i < 0 || i >= n = [0]
| otherwise = lbIxsI xs i
where
n = V.length xs
newtype FeatIx = FeatIx { unFeatIx :: Int }
deriving ( Show, Eq, Ord, Binary, A.IArray A.UArray
, G.Vector U.Vector, G.MVector U.MVector, U.Unbox )