module Data.Store.Storable
( Storable(..)
, insert
, insert'
, updateWithKey
, updateWithKey'
, update
, update'
, fromList
, fromList'
) where
import qualified Data.Store.Internal.Type as I
import qualified Data.Store as S
import qualified Data.Store.Selection as S (IsSelection())
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
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 . 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' . map (\v -> (key v, v))