module Data.CRF.Chain2.Generic.Base
( AVec (unAVec)
, mkAVec
, AVec2 (unAVec2)
, mkAVec2
, X (_unX, _unR)
, Xs
, mkX
, unX
, unR
, lbAt
, Y (_unY)
, Ys
, mkY
, unY
, LbIx
) where
import qualified Data.Set as S
import qualified Data.Map as M
import qualified Data.Vector as V
type LbIx = Int
newtype AVec a = AVec { unAVec :: V.Vector a }
deriving (Show, Read, 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, Read, 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, Read, 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
lbAt :: X o t -> LbIx -> t
lbAt x = (unAVec (_unR x) V.!)
newtype Y t = Y { _unY :: AVec2 t Double }
deriving (Show, Read, 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)