module Colada.Features
( features
, featureSeq
)
where
import Data.List.Zipper
import qualified Data.IntMap as IntMap
featureSeq:: (Maybe a -> Maybe a -> Maybe a)
-> Zipper a
-> [IntMap.IntMap a]
featureSeq (+++) = foldrz (\zi z -> features (+++) zi : z) []
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
index :: (Eq a, Num a) => a -> [b] -> Maybe b
index 1 (x:_) = Just x
index _ [] = Nothing
index i (_:xs) = index (i1) xs