module Data.Store.Storable
( Storable(..)
, map
, insert
, insert'
, updateWithKey
, updateWithKey'
, update
, update'
, fromList
, fromList'
) where
import Data.Functor.Identity
import qualified Data.List (map)
import qualified Data.Store.Internal.Type as I
import qualified Data.Store.Internal.Function as I
import qualified Data.Store as S
import qualified Data.Store.Selection as S (IsSelection())
#if MIN_VERSION_containers(0,5,0)
import qualified Data.IntMap.Strict as Data.IntMap
#else
import qualified Data.IntMap
#endif
import Prelude hiding (map)
class Storable v where
type StoreKRS t :: *
type StoreIRS t :: *
type StoreTS t :: *
key :: v -> S.Key (StoreKRS v) (StoreTS v)
insert :: Storable v
=> v
-> S.Store tag (StoreKRS v) (StoreIRS v) (StoreTS v) v
-> Maybe (S.RawKey (StoreKRS v) (StoreTS v), S.Store tag (StoreKRS v) (StoreIRS v) (StoreTS v) v)
insert v = S.insert (key v) v
insert' :: Storable v
=> v
-> S.Store tag (StoreKRS v) (StoreIRS v) (StoreTS v) v
-> (S.RawKey (StoreKRS v) (StoreTS v), S.Store tag (StoreKRS v) (StoreIRS v) (StoreTS v) v)
insert' v = S.insert' (key v) v
map :: Storable v
=> (v -> v)
-> S.Store tag (StoreKRS v) (StoreIRS v) (StoreTS v) v
-> S.Store tag (StoreKRS v) (StoreIRS v) (StoreTS v) v
map tr s@(I.Store values _ _) = runIdentity $! I.genericUpdateWithKey
I.indexInsertID'
(\_ e -> let tre = tr e in Just (tre, Just $! key tre))
(Data.IntMap.keysSet values)
s
update :: (Storable v, S.IsSelection sel)
=> (v -> Maybe v)
-> sel tag (StoreKRS v) (StoreIRS v) (StoreTS v)
-> S.Store tag (StoreKRS v) (StoreIRS v) (StoreTS v) v
-> Maybe (S.Store tag (StoreKRS v) (StoreIRS v) (StoreTS v) v)
update tr = S.update (maybe Nothing (\v -> Just (v, Just $! key v)) . tr)
update' :: (Storable v, S.IsSelection sel)
=> (v -> Maybe v)
-> sel tag (StoreKRS v) (StoreIRS v) (StoreTS v)
-> S.Store tag (StoreKRS v) (StoreIRS v) (StoreTS v) v
-> S.Store tag (StoreKRS v) (StoreIRS v) (StoreTS v) v
update' tr = S.update' (maybe Nothing (\v -> Just (v, Just $! key v)) . tr)
updateWithKey :: (Storable v, S.IsSelection sel)
=> (S.RawKey (StoreKRS v) (StoreTS v) -> v -> Maybe v)
-> sel tag (StoreKRS v) (StoreIRS v) (StoreTS v)
-> S.Store tag (StoreKRS v) (StoreIRS v) (StoreTS v) v
-> Maybe (S.Store tag (StoreKRS v) (StoreIRS v) (StoreTS v) v)
updateWithKey tr = S.updateWithKey (\rk vv -> maybe Nothing (\v -> Just (v, Just $! key v)) $ tr rk vv)
updateWithKey' :: (Storable v, S.IsSelection sel)
=> (S.RawKey (StoreKRS v) (StoreTS v) -> v -> Maybe v)
-> sel tag (StoreKRS v) (StoreIRS v) (StoreTS v)
-> S.Store tag (StoreKRS v) (StoreIRS v) (StoreTS v) v
-> S.Store tag (StoreKRS v) (StoreIRS v) (StoreTS v) v
updateWithKey' tr = S.updateWithKey' (\rk vv -> maybe Nothing (\v -> Just (v, Just $! key v)) $ tr rk vv)
fromList :: (I.Empty (I.Index (StoreIRS v) (StoreTS v)), Storable v)
=> [v]
-> Maybe (S.Store tag (StoreKRS v) (StoreIRS v) (StoreTS v) v)
fromList = S.fromList . Data.List.map (\v -> (key v, v))
fromList' :: (I.Empty (I.Index (StoreIRS v) (StoreTS v)), Storable v)
=> [v]
-> I.Store tag (StoreKRS v) (StoreIRS v) (StoreTS v) v
fromList' = S.fromList' . Data.List.map (\v -> (key v, v))