random-class 0.1.0.0 → 0.1.1.0
raw patch · 3 files changed
+24/−1 lines, 3 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
+ Random: skip :: Gen g => Natural -> g -> g
+ Random: skipM :: (Gen g, Mut (PrimState m) g ~ MutVar (PrimState m) g, PrimMonad m) => Natural -> ReaderT (Mut (PrimState m) g) m ()
- Random: class Gen g where type Mut s g = m | m -> s g type Native g type Mut s g = MutVar s g uniformNativeM = ReaderT $ flip atomicModifyMutVar $ swap . runState uniformNative where {
+ Random: class Gen g where type Mut s g = m | m -> s g type Native g type Mut s g = MutVar s g uniformNativeM = ReaderT $ flip atomicModifyMutVar $ swap . runState uniformNative skip n = appEndo . stimes n . Endo $ execState uniformNative skipM = flip replicateA_ (() <$ uniformNativeM) where {
Files
- Random.hs +11/−0
- Util.hs +12/−0
- random-class.cabal +1/−1
Random.hs view
@@ -6,8 +6,10 @@ import Control.Monad.Trans.Reader import qualified Control.Monad.Trans.State as M import Data.Primitive.MutVar+import Data.Semigroup import Data.Tuple (swap) import Data.Void+import Numeric.Natural import Util @@ -17,9 +19,18 @@ type Native g uniformNative :: M.State g (Native g) uniformNativeM :: PrimMonad m => ReaderT (Mut (PrimState m) g) m (Native g)+ skip :: Natural -> g -> g+ skipM :: PrimMonad m => Natural -> ReaderT (Mut (PrimState m) g) m ()+ default uniformNativeM :: (Mut (PrimState m) g ~ MutVar (PrimState m) g, PrimMonad m) => ReaderT (Mut (PrimState m) g) m (Native g) uniformNativeM = ReaderT $ flip atomicModifyMutVar $ swap . M.runState uniformNative++ skip n = appEndo . stimes n . Endo $ M.execState uniformNative++ default skipM :: (Mut (PrimState m) g ~ MutVar (PrimState m) g,+ PrimMonad m) => Natural -> ReaderT (Mut (PrimState m) g) m ()+ skipM = flip replicateA_ (() <$ uniformNativeM) class Split g where split :: g -> (g, g)
Util.hs view
@@ -1,12 +1,24 @@+{-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE AllowAmbiguousTypes #-} module Util where +import Control.Applicative import qualified Data.List as L+import Data.Semigroup import Numeric.Natural replicateA :: Applicative p => Natural -> p a -> p [a] replicateA n = sequenceA . L.genericReplicate n++replicateA_ :: Applicative p => Natural -> p () -> p ()+replicateA_ n = unAp . stimes n . Ap++newtype Ap p a = Ap { unAp :: p a } deriving (Functor, Applicative)+instance (Applicative p, Semigroup a) => Semigroup (Ap p a) where (<>) = liftA2 (<>)+instance (Applicative p, Semigroup a, Monoid a) => Monoid (Ap p a) where+ mempty = pure mempty+ mappend = (<>) card :: ∀ a . (Bounded a, Enum a) => Natural card = L.genericLength [minBound @a..]
random-class.cabal view
@@ -1,5 +1,5 @@ name: random-class-version: 0.1.0.0+version: 0.1.1.0 synopsis: Class of random value generation -- description: license: BSD3