module Data.FullList.Strict
( FullList
, size
, singleton
, lookup
, insert
, delete
, insertWith
, adjust
, map
, traverseWithKey
, foldlWithKey'
, foldrWithKey
, filterWithKey
) where
import Prelude hiding (lookup, map)
import Data.FullList.Lazy hiding (insertWith, map, adjust)
insertWith :: Eq k => (v -> v -> v) -> k -> v -> FullList k v -> FullList k v
insertWith f !k v (FL k' v' xs)
| k == k' = let v'' = f v v' in v'' `seq` FL k v'' xs
| otherwise = FL k' v' (insertWithL f k v xs)
#if __GLASGOW_HASKELL__ >= 700
#endif
insertWithL :: Eq k => (v -> v -> v) -> k -> v -> List k v -> List k v
insertWithL = go
where
go _ !k v Nil = Cons k v Nil
go f k v (Cons k' v' xs)
| k == k' = let v'' = f v v' in v'' `seq` Cons k v'' xs
| otherwise = Cons k' v' (go f k v xs)
#if __GLASGOW_HASKELL__ >= 700
#endif
adjust :: Eq k => (v -> v) -> k -> FullList k v -> FullList k v
adjust f !k (FL k' v xs)
| k == k' = let v' = f v in v' `seq` FL k' v' xs
| otherwise = FL k' v (adjustL f k xs)
#if __GLASGOW_HASKELL__ >= 700
#endif
adjustL :: Eq k => (v -> v) -> k -> List k v -> List k v
adjustL f = go
where
go !_ Nil = Nil
go k (Cons k' v xs)
| k == k' = let v' = f v in v' `seq` Cons k' v' xs
| otherwise = Cons k' v (go k xs)
#if __GLASGOW_HASKELL__ >= 700
#endif
map :: (k1 -> v1 -> (k2, v2)) -> FullList k1 v1 -> FullList k2 v2
map f (FL k v xs) = let !(k', !v') = f k v
in FL k' v' (mapL f xs)
mapL :: (k1 -> v1 -> (k2, v2)) -> List k1 v1 -> List k2 v2
mapL f = go
where
go Nil = Nil
go (Cons k v xs) = let !(k', !v') = f k v
in Cons k' v' (go xs)