colada-0.4.2: Colada/Features.hs
module Colada.Features
( features
, featureSeq
)
where
import Data.List.Zipper
import qualified Data.IntMap as IntMap
-- | @featureSeq f z@ extracts features at each position of z
-- following current position, using f to combine features into bigrams.
featureSeq:: (Maybe a -> Maybe a -> Maybe a)
-> Zipper a
-> [IntMap.IntMap a]
featureSeq (+++) = foldrz (\zi z -> features (+++) zi : z) []
-- | @features f z@ extracts features at the current position of z,
-- using f to combine features into bigrams.
features :: (Maybe a -> Maybe a -> Maybe a) -> Zipper a -> IntMap.IntMap a
features (+++) z =
let fs = [
(0 , at 0 z )
, (-2, at (-2) z )
, (-1, at (-1) z )
, (-12, at (-2) z +++ at (-1) z)
, (12, at 1 z +++ at 2 z)
, (1, at 1 z)
, (2, at 2 z)
]
in IntMap.fromList [ (k, v) | (k,Just v) <- fs ]
at :: Int -> Zipper a -> Maybe a
at i (Zip ls _) | i < 0 = index (negate i) ls
at i (Zip _ rs) | i > 0 = index (i+1) rs
at _ z = safeCursor z -- i == 0
index :: (Eq a, Num a) => a -> [b] -> Maybe b
index 1 (x:_) = Just x
index _ [] = Nothing
index i (_:xs) = index (i-1) xs