diff --git a/Data/Buffon/Machine.hs b/Data/Buffon/Machine.hs
--- a/Data/Buffon/Machine.hs
+++ b/Data/Buffon/Machine.hs
@@ -45,7 +45,7 @@
      in Algorithms and Complexity: New Directions and Recent Results,
      Academic Press, (1976)
  -}
-{-# LANGUAGE TupleSections, BangPatterns, DeriveLift #-}
+{-# LANGUAGE BangPatterns, DeriveLift #-}
 module Data.Buffon.Machine
     ( -- * Buffon machines and related utilities.
       Rand(..), empty, init
@@ -61,7 +61,7 @@
     , flip, flip'
 
     -- * Bernoulli variable generators.
-    , dyadic, rational, real
+    , rational, real
 
     -- * Buffon machine combinators.
     , repeat, cond, neg
@@ -105,9 +105,9 @@
 
 -- | 32-bit buffered random bit generator (RBG).
 data Rand g =
-    Rand { buffer  :: Word32 -- ^ Generator buffer.
-         , counter :: Int    -- ^ Number of consumed buffer bits.
-         , oracle  :: g      -- ^ Random bit oracle.
+    Rand { buffer  :: !Word32 -- ^ Generator buffer.
+         , counter :: !Int    -- ^ Number of consumed buffer bits.
+         , oracle  :: !g      -- ^ Random bit oracle.
          }
 
 -- | Checks if the given RBG is empty or not.
@@ -117,10 +117,10 @@
 
 -- | A fresh RBG.
 init :: RandomGen g => g -> Rand g
-init g = let (x, g') = random g
-             in Rand { buffer  = x
-                     , counter = 0
-                     , oracle  = g' }
+init g = case random g of
+          (x, g') -> Rand { buffer  = x
+                          , counter = 0
+                          , oracle  = g' }
 
 -- | Computations consuming random bits using RBGs.
 --   Note that the implementation is essentially a State monad,
@@ -136,11 +136,11 @@
     (<*>) = ap
 
 instance Monad (BuffonMachine g) where
-    return x = BuffonMachine (x,)
+    return x = BuffonMachine $ \ !rng -> (x, rng)
     (BuffonMachine f) >>= h =
-        BuffonMachine $ \rng ->
-            let (x, rng') = f rng
-             in runR (h x) rng'
+        BuffonMachine $ \ !rng ->
+            case f rng of
+              (x, !rng') -> runR (h x) rng'
 
 -- | Runs the given Buffon machine within the IO monad
 --    using StdGen as its random bit oracle.
@@ -203,7 +203,7 @@
 histogramIO m n = runRIO (histogram m n) >>= print
 
 mkFlip :: Rand g -> (Bool, Rand g)
-mkFlip rng =
+mkFlip !rng =
     (testBit (buffer rng) (counter rng), -- test the respective bit.
         rng { counter = succ (counter rng) })
 
@@ -223,7 +223,7 @@
 -- | Random coin flip. Note that the implementation
 --   handles the regeneration of the RBG, see 'Rand'.
 flip :: RandomGen g => Bern g
-flip = BuffonMachine $ \rng ->
+flip = BuffonMachine $ \ !rng ->
     mkFlip $ if empty rng then init (oracle rng)
                           else rng
 
@@ -241,12 +241,6 @@
       (True, False) -> return True
       _             -> flip'
 
--- | Generates all 2^n boolean strings of length n.
-genStream :: Int -> [[Bool]]
-genStream 0 = [[]]
-genStream !n =  map (False :) (genStream $ pred n)
-             ++ map (True :) (genStream $ pred n)
-
 -- | Evaluates the given Bernoulli variable n times
 --   and returns a list of resulting values.
 repeat :: RandomGen g
@@ -258,13 +252,6 @@
     bs <- repeat (pred n) m
     return (b : bs)
 
--- | Bernoulli variable machine with dyadic parameter λ = s/(2^t).
-dyadic :: RandomGen g => Int -> Int -> Bern g
-dyadic s t = do
-    let ps = take s (genStream t)
-    bs <- repeat t flip
-    return $ bs `elem` ps
-
 -- | Given parameters a < b, both positive, returns a Bernoulli
 --   variable with rational parameter λ = a/b. Note: Implements
 --   the algorithm 'Bernoulli' described by J. Lumbroso.
@@ -639,11 +626,21 @@
 
 -- | Draws a discrete variable according
 --   to the given decision tree.
-choice :: (Num a, Enum a, RandomGen g)
+choice :: RandomGen g
        => DecisionTree a -> BuffonMachine g a
 
-choice (Decision n) = return n
-choice (Toss lt rt) = do
+choice !x = do
     heads <- flip
-    if heads then choice rt
-             else choice lt
+    choice' heads x
+
+choice' :: RandomGen g
+        =>  Bool -> DecisionTree a -> BuffonMachine g a
+
+choice' _ (Decision n) = return n
+choice' True (Toss _ rt) = do
+    heads <- flip
+    choice' heads rt
+
+choice' False (Toss lt _) = do
+    heads <- flip
+    choice' heads lt
diff --git a/buffon-machines.cabal b/buffon-machines.cabal
--- a/buffon-machines.cabal
+++ b/buffon-machines.cabal
@@ -1,5 +1,5 @@
 name:           buffon-machines
-version:        1.0.0.0
+version:        1.1.0.0
 synopsis:       Perfect simulation of discrete random variables
 description:    Monadic implementation of Buffon machines meant for perfect simulation of discrete random variables
 homepage:       https://github.com/maciej-bendkowski/buffon-machines#readme
