module Data.Urn (
Urn,
Weight,
MonadSample,
singleton, fromList, fromNonEmpty,
sample, sampleM,
remove, removeM,
insert,
update, replace,
frequency,
addToUrn,
size, totalWeight
) where
import Data.Urn.Common
import Data.Urn.Index (randomIndex)
import qualified Data.Urn.Index as Index
sample :: MonadSample m => Urn a -> m a
sample u = Index.sample u <$> randomIndex u
sampleM :: MonadSample m => Urn (m a) -> m a
sampleM u = Index.sample u =<< randomIndex u
remove :: MonadSample m => Urn a -> m (Weight, a, Maybe (Urn a))
remove u = Index.remove u <$> randomIndex u
removeM :: MonadSample m => Urn (m a) -> m (Weight, a, Maybe (Urn (m a)))
removeM u = do (w,ma,mu) <- remove u
(w, ,mu) <$> ma
update :: MonadSample m
=> (Weight -> a -> (Weight, a))
-> Urn a
-> m (Weight, a, Weight, a, Urn a)
update upd u = Index.update upd u <$> randomIndex u
replace :: MonadSample m => Weight -> a -> Urn a -> m (Weight, a, Urn a)
replace w a u = Index.replace w a u <$> randomIndex u
frequency :: MonadSample m => [(Weight, m a)] -> m a
frequency = maybe (error "Data.Urn.frequency used with empty list") sampleM . fromList