module Hat.Random
  (RandomGen(gnext,gsplit,ggenRange,snext,ssplit,sgenRange),StdGen(),gmkStdGen
    ,amkStdGen,hmkStdGen,Random(grandom,grandomR,grandoms,grandomRs,grandomIO
      ,grandomRIO,srandom,srandomR,srandoms,srandomRs,srandomIO,srandomRIO)
    ,ggetStdRandom,agetStdRandom,hgetStdRandom,ggetStdGen,gsetStdGen,asetStdGen
    ,hsetStdGen,gnewStdGen) where

import qualified Hat.PreludeBasic 
import qualified Prelude 
import Hat.Hack 
import qualified Hat.Hat as T 
import Hat.Hat  (WrapVal(wrapVal))
import Hat.Prelude 
import Hat.PreludeBuiltinTypes 
import Hat.RandomBuiltin 
import qualified System.Random as Random 
import Hat.Char 

class RandomGen g
  where
  
  ggenRange :: T.RefSrcPos -> T.RefExp -> T.R (T.Fun g (T.Tuple2 Int Int))
  
  gnext :: T.RefSrcPos -> T.RefExp -> T.R (T.Fun g (T.Tuple2 Int g))
  
  gsplit :: T.RefSrcPos -> T.RefExp -> T.R (T.Fun g (T.Tuple2 g g))
  
  ggenRange pgenRange p =
    T.ufun1 a24v3v24v34genRange pgenRange p hgenRange
    where
    
    hgenRange fg p =
      T.con2 T.mkNoSrcPos p T.Tuple2 T.aTuple2 (gminBound T.mkNoSrcPos p)
        (gmaxBound T.mkNoSrcPos p)
    
  
  sgenRange :: T.R (T.Fun g (T.Tuple2 Int Int))
  
  snext :: T.R (T.Fun g (T.Tuple2 Int g))
  
  ssplit :: T.R (T.Fun g (T.Tuple2 g g))
  

instance RandomGen (StdGen)
  where
  
  ggenRange pgenRange p = T.uconstUse pgenRange p sgenRange
  
  sgenRange =
    T.uconstDef T.mkRoot a31v3v31v31genRange
      (\ p -> gprimStdGenGenRange T.mkNoSrcPos p)
  
  gnext pnext p = T.uconstUse pnext p snext
  
  snext =
    T.uconstDef T.mkRoot a32v3v32v23next (\ p -> gprimStdGenNext T.mkNoSrcPos p)
  
  gsplit psplit p = T.uconstUse psplit p ssplit
  
  ssplit =
    T.uconstDef T.mkRoot a33v3v33v25split
      (\ p -> gprimStdGenSplit T.mkNoSrcPos p)
  

instance Read (StdGen)
  where
  
  greadsPrec preadsPrec p = T.uconstUse preadsPrec p sreadsPrec
  
  sreadsPrec =
    T.uconstDef T.mkRoot a36v3v36v33readsPrec
      (\ p -> gprimStdGenReadsPrec T.mkNoSrcPos p)
  

instance Show (StdGen)
  where
  
  gshowsPrec pshowsPrec p = T.uconstUse pshowsPrec p sshowsPrec
  
  sshowsPrec =
    T.uconstDef T.mkRoot a39v3v39v33showsPrec
      (\ p -> gprimStdGenShowsPrec T.mkNoSrcPos p)
  

gprimStdGenGenRange ::
  T.RefSrcPos -> T.RefExp -> T.R (T.Fun StdGen (T.Tuple2 Int Int))

gprimStdGenGenRange pprimStdGenGenRange p =
  T.ufun1 aprimStdGenGenRange pprimStdGenGenRange p hprimStdGenGenRange

hprimStdGenGenRange z1primStdGenGenRange kprimStdGenGenRange =
  (T.fromTuple2 T.fromInt T.fromInt) kprimStdGenGenRange
    (Random.genRange (toStdGen kprimStdGenGenRange z1primStdGenGenRange))

gprimStdGenNext ::
  T.RefSrcPos -> T.RefExp -> T.R (T.Fun StdGen (T.Tuple2 Int StdGen))

gprimStdGenNext pprimStdGenNext p =
  T.ufun1 aprimStdGenNext pprimStdGenNext p hprimStdGenNext

hprimStdGenNext z1primStdGenNext kprimStdGenNext =
  (T.fromTuple2 T.fromInt fromStdGen) kprimStdGenNext
    (Random.next (toStdGen kprimStdGenNext z1primStdGenNext))

gprimStdGenSplit ::
  T.RefSrcPos -> T.RefExp -> T.R (T.Fun StdGen (T.Tuple2 StdGen StdGen))

gprimStdGenSplit pprimStdGenSplit p =
  T.ufun1 aprimStdGenSplit pprimStdGenSplit p hprimStdGenSplit

hprimStdGenSplit z1primStdGenSplit kprimStdGenSplit =
  (T.fromTuple2 fromStdGen fromStdGen) kprimStdGenSplit
    (Random.split (toStdGen kprimStdGenSplit z1primStdGenSplit))

gprimStdGenReadsPrec ::
  T.RefSrcPos ->
    T.RefExp -> T.R (T.Fun Int (T.Fun String (T.List (T.Tuple2 StdGen String))))

gprimStdGenReadsPrec pprimStdGenReadsPrec p =
  T.ufun2 aprimStdGenReadsPrec pprimStdGenReadsPrec p hprimStdGenReadsPrec

hprimStdGenReadsPrec z1primStdGenReadsPrec z2primStdGenReadsPrec
  kprimStdGenReadsPrec =
  (fromList (T.fromTuple2 fromStdGen fromString)) kprimStdGenReadsPrec
    (Prelude.readsPrec (T.toInt kprimStdGenReadsPrec z1primStdGenReadsPrec)
      (toString kprimStdGenReadsPrec z2primStdGenReadsPrec))

gprimStdGenShowsPrec ::
  T.RefSrcPos ->
    T.RefExp -> T.R (T.Fun Int (T.Fun StdGen (T.Fun String String)))

gprimStdGenShowsPrec pprimStdGenShowsPrec p =
  T.ufun3 aprimStdGenShowsPrec pprimStdGenShowsPrec p hprimStdGenShowsPrec

hprimStdGenShowsPrec z1primStdGenShowsPrec z2primStdGenShowsPrec
  z3primStdGenShowsPrec kprimStdGenShowsPrec =
  fromString kprimStdGenShowsPrec
    (Prelude.showsPrec (T.toInt kprimStdGenShowsPrec z1primStdGenShowsPrec)
      (toStdGen kprimStdGenShowsPrec z2primStdGenShowsPrec)
      (toString kprimStdGenShowsPrec z3primStdGenShowsPrec))

gmkStdGen :: T.RefSrcPos -> T.RefExp -> T.R (T.Fun Int StdGen)

gmkStdGen pmkStdGen p = T.ufun1 amkStdGen pmkStdGen p hmkStdGen

hmkStdGen z1mkStdGen kmkStdGen =
  fromStdGen kmkStdGen (Random.mkStdGen (T.toInt kmkStdGen z1mkStdGen))

class Random a
  where
  
  grandomR ::
    RandomGen g =>
    T.RefSrcPos ->
      T.RefExp -> T.R (T.Fun (T.Tuple2 a a) (T.Fun g (T.Tuple2 a g)))
  
  grandom ::
    RandomGen g => T.RefSrcPos -> T.RefExp -> T.R (T.Fun g (T.Tuple2 a g))
  
  grandomRs ::
    RandomGen g =>
    T.RefSrcPos -> T.RefExp -> T.R (T.Fun (T.Tuple2 a a) (T.Fun g (T.List a)))
  
  grandoms :: RandomGen g => T.RefSrcPos -> T.RefExp -> T.R (T.Fun g (T.List a))
  
  grandomRIO :: T.RefSrcPos -> T.RefExp -> T.R (T.Fun (T.Tuple2 a a) (IO a))
  
  grandomIO :: T.RefSrcPos -> T.RefExp -> T.R (IO a)
  
  grandoms prandoms p =
    T.ufun1 a68v3v70v21randoms prandoms p hrandoms
    where
    
    hrandoms fg p =
      T.con2 T.mkNoSrcPos p T.Cons T.aCons (gx T.mkNoSrcPos p)
        (T.uap1 T.mkNoSrcPos p (grandoms T.mkNoSrcPos p) (gg' T.mkNoSrcPos p))
      where
      
      gx px p = T.uconstUse px p sx
      
      gg' px p = T.uconstUse px p sg'
      
      j70v5v70v10x =
        case T.uap1 T.mkNoSrcPos p (grandom T.mkNoSrcPos p) fg of
          T.R (T.Tuple2 fx fg') kx -> (kx,fx,fg')
          _ -> T.fatal p
      
      sx =
        T.uconstDef p a70v6v70v6x
          (\ _ -> case j70v5v70v10x of (kx,fx,fg') -> fx)
      
      sg' =
        T.uconstDef p a70v8v70v9g'
          (\ _ -> case j70v5v70v10x of (kx,fx,fg') -> fg')
      
    
  
  grandomRs prandomRs p =
    T.ufun2 a71v3v73v28randomRs prandomRs p hrandomRs
    where
    
    hrandomRs frange fg p =
      T.con2 T.mkNoSrcPos p T.Cons T.aCons (gx T.mkNoSrcPos p)
        (T.uap2 T.mkNoSrcPos p (grandomRs T.mkNoSrcPos p) frange
          (gg' T.mkNoSrcPos p))
      where
      
      gx px p = T.uconstUse px p sx
      
      gg' px p = T.uconstUse px p sg'
      
      j73v5v73v10x =
        case T.uap2 T.mkNoSrcPos p (grandomR T.mkNoSrcPos p) frange fg of
          T.R (T.Tuple2 fx fg') kx -> (kx,fx,fg')
          _ -> T.fatal p
      
      sx =
        T.uconstDef p a73v6v73v6x
          (\ _ -> case j73v5v73v10x of (kx,fx,fg') -> fx)
      
      sg' =
        T.uconstDef p a73v8v73v9g'
          (\ _ -> case j73v5v73v10x of (kx,fx,fg') -> fg')
      
    
  
  grandomIO prandomIO p = T.uconstUse prandomIO p srandomIO
  
  srandomIO =
    T.uconstDef T.mkRoot a74v3v74v39randomIO
      (\ p -> T.uwrapForward p (hgetStdRandom (grandom T.mkNoSrcPos p) p))
  
  grandomRIO prandomRIO p =
    T.ufun1 a75v3v75v47randomRIO prandomRIO p hrandomRIO
    where
    
    hrandomRIO frange p =
      T.uwrapForward p
        (hgetStdRandom (T.uap1 T.mkNoSrcPos p (grandomR T.mkNoSrcPos p) frange)
          p)
    
  
  srandomR :: RandomGen g => T.R (T.Fun (T.Tuple2 a a) (T.Fun g (T.Tuple2 a g)))
  
  srandom :: RandomGen g => T.R (T.Fun g (T.Tuple2 a g))
  
  srandomRs :: RandomGen g => T.R (T.Fun (T.Tuple2 a a) (T.Fun g (T.List a)))
  
  srandoms :: RandomGen g => T.R (T.Fun g (T.List a))
  
  srandomRIO :: T.R (T.Fun (T.Tuple2 a a) (IO a))
  
  srandomIO :: T.R (IO a)
  

instance Random (Int)
  where
  
  grandomR prandomR p =
    T.ufun2 a78v3v78v66randomR prandomR p hrandomR
    where
    
    hrandomR (T.R (T.Tuple2 fa fb) _) fg p =
      T.uwrapForward p
        (hrandomIvalInteger
          (T.con2 T.mkNoSrcPos p T.Tuple2 T.aTuple2
            (T.uap1 T.mkNoSrcPos p (gtoInteger T.mkNoSrcPos p) fa)
            (T.uap1 T.mkNoSrcPos p (gtoInteger T.mkNoSrcPos p) fb)) fg p)
    hrandomR _ _ p = T.fatal p
    
  
  grandom prandom p =
    T.ufun1 a79v3v79v49random prandom p hrandom
    where
    
    hrandom fg p =
      T.uap2 T.mkNoSrcPos p (grandomR T.mkNoSrcPos p)
        (T.con2 T.mkNoSrcPos p T.Tuple2 T.aTuple2 (gminBound T.mkNoSrcPos p)
          (gmaxBound T.mkNoSrcPos p)) fg
    
  

instance Random (Integer)
  where
  
  grandomR prandomR p =
    T.ufun2 a82v3v82v43randomR prandomR p hrandomR
    where
    
    hrandomR fival fg p = T.uwrapForward p (hrandomIvalInteger fival fg p)
    
  
  grandom prandom p =
    T.ufun1 a83v3v83v83random prandom p hrandom
    where
    
    hrandom fg p =
      T.uap2 T.mkNoSrcPos p (grandomR T.mkNoSrcPos p)
        (T.con2 T.mkNoSrcPos p T.Tuple2 T.aTuple2
          (T.uap1 T.mkNoSrcPos p (gtoInteger T.mkNoSrcPos p)
            (gminBound T.mkNoSrcPos p :: T.R Int))
          (T.uap1 T.mkNoSrcPos p (gtoInteger T.mkNoSrcPos p)
            (gmaxBound T.mkNoSrcPos p :: T.R Int))) fg
    
  

instance Random (Float)
  where
  
  grandom prandom p =
    T.ufun1 a86v3v86v63random prandom p hrandom
    where
    
    hrandom fg p =
      T.uwrapForward p
        (hrandomIvalDouble
          (T.con2 T.mkNoSrcPos p T.Tuple2 T.aTuple2
            (T.uap1 T.mkNoSrcPos p
                (Hat.PreludeBasic.gfromInteger T.mkNoSrcPos p)
                (T.conInteger T.mkNoSrcPos p 0)
              :: T.R Double)
            (T.uap1 T.mkNoSrcPos p
              (Hat.PreludeBasic.gfromInteger T.mkNoSrcPos p)
              (T.conInteger T.mkNoSrcPos p 1))) (grealToFrac T.mkNoSrcPos p) fg
          p)
    
  
  grandomR prandomR p =
    T.ufun2 a87v3v87v78randomR prandomR p hrandomR
    where
    
    hrandomR (T.R (T.Tuple2 fa fb) _) fg p =
      T.uwrapForward p
        (hrandomIvalDouble
          (T.con2 T.mkNoSrcPos p T.Tuple2 T.aTuple2
            (T.uap1 T.mkNoSrcPos p (grealToFrac T.mkNoSrcPos p) fa)
            (T.uap1 T.mkNoSrcPos p (grealToFrac T.mkNoSrcPos p) fb))
          (grealToFrac T.mkNoSrcPos p) fg p)
    hrandomR _ _ p = T.fatal p
    
  

instance Random (Double)
  where
  
  grandomR prandomR p =
    T.ufun2 a90v3v90v45randomR prandomR p hrandomR
    where
    
    hrandomR fival fg p =
      T.uwrapForward p (hrandomIvalDouble fival (gid T.mkNoSrcPos p) fg p)
    
  
  grandom prandom p =
    T.ufun1 a91v3v91v42random prandom p hrandom
    where
    
    hrandom fg p =
      T.uap2 T.mkNoSrcPos p (grandomR T.mkNoSrcPos p)
        (T.con2 T.mkNoSrcPos p T.Tuple2 T.aTuple2
          (T.uap1 T.mkNoSrcPos p (Hat.PreludeBasic.gfromInteger T.mkNoSrcPos p)
              (T.conInteger T.mkNoSrcPos p 0)
            :: T.R Double)
          (T.uap1 T.mkNoSrcPos p (Hat.PreludeBasic.gfromInteger T.mkNoSrcPos p)
            (T.conInteger T.mkNoSrcPos p 1))) fg
    
  

instance Random (Bool)
  where
  
  grandomR prandomR p =
    T.ufun2 a94v3v105v22randomR prandomR p hrandomR
    where
    
    hrandomR (T.R (T.Tuple2 fa fb) _) fg p =
      T.uccase T.mkNoSrcPos p
        (let
          v95v5v97v33v1 (T.R (T.Tuple2 fx fg) _) p =
            T.con2 T.mkNoSrcPos p T.Tuple2 T.aTuple2
              (T.uwrapForward p (hint2Bool fx p)) fg
          v95v5v97v33v1 _ p = T.fatal p in (v95v5v97v33v1))
        (T.uwrapForward p
          (hrandomIvalInteger
            (T.con2 T.mkNoSrcPos p T.Tuple2 T.aTuple2
              (T.uwrapForward p (hbool2Integer fa p))
              (T.uwrapForward p (hbool2Integer fb p))) fg p))
      where
      
      gbool2Integer :: T.RefSrcPos -> T.RefExp -> T.R (T.Fun Bool Integer)
      
      hbool2Integer :: (T.R Bool) -> T.RefExp -> T.R Integer
      
      gbool2Integer pbool2Integer p =
        T.ufun1 a100v5v101v26bool2Integer pbool2Integer p hbool2Integer
      
      abool2Integer = a100v5v101v26bool2Integer
      
      hbool2Integer (T.R False _) p =
        T.uap1 T.mkNoSrcPos p (Hat.PreludeBasic.gfromInteger T.mkNoSrcPos p)
          (T.conInteger T.mkNoSrcPos p 0)
      hbool2Integer (T.R True _) p =
        T.uap1 T.mkNoSrcPos p (Hat.PreludeBasic.gfromInteger T.mkNoSrcPos p)
          (T.conInteger T.mkNoSrcPos p 1)
      hbool2Integer _ p = T.fatal p
      
      gint2Bool :: T.RefSrcPos -> T.RefExp -> T.R (T.Fun Int Bool)
      
      hint2Bool :: (T.R Int) -> T.RefExp -> T.R Bool
      
      gint2Bool pint2Bool p =
        T.ufun1 a104v5v105v22int2Bool pint2Bool p hint2Bool
      
      aint2Bool = a104v5v105v22int2Bool
      
      hint2Bool fv104v14v104v14n p =
        T.ucguard
          (T.uap2 T.mkNoSrcPos p (T.mkNoSrcPos Hat.Prelude.!== p)
            fv104v14v104v14n
            (T.uap1 T.mkNoSrcPos p
              (Hat.PreludeBasic.gfromInteger T.mkNoSrcPos p)
              (T.conInteger T.mkNoSrcPos p 0))) (h p)
          (y1int2Bool fv104v14v104v14n p)
        where
        
        h p = T.con0 T.mkNoSrcPos p False aFalse
        h p = y1int2Bool fv104v14v104v14n p
        
      hint2Bool fv104v14v104v14n p = y1int2Bool fv104v14v104v14n p
      
      y1int2Bool _ p = T.con0 T.mkNoSrcPos p True aTrue
      
    hrandomR _ _ p = T.fatal p
    
  
  grandom prandom p =
    T.ufun1 a107v3v107v42random prandom p hrandom
    where
    
    hrandom fg p =
      T.uap2 T.mkNoSrcPos p (grandomR T.mkNoSrcPos p)
        (T.con2 T.mkNoSrcPos p T.Tuple2 T.aTuple2 (gminBound T.mkNoSrcPos p)
          (gmaxBound T.mkNoSrcPos p)) fg
    
  

instance Random (Char)
  where
  
  grandomR prandomR p =
    T.ufun2 a110v3v112v27randomR prandomR p hrandomR
    where
    
    hrandomR (T.R (T.Tuple2 fa fb) _) fg p =
      T.uccase T.mkNoSrcPos p
        (let
          v111v7v112v27v1 (T.R (T.Tuple2 fx fg) _) p =
            T.con2 T.mkNoSrcPos p T.Tuple2 T.aTuple2
              (T.uap1 T.mkNoSrcPos p (gchr T.mkNoSrcPos p) fx) fg
          v111v7v112v27v1 _ p = T.fatal p in (v111v7v112v27v1))
        (T.uwrapForward p
          (hrandomIvalInteger
            (T.con2 T.mkNoSrcPos p T.Tuple2 T.aTuple2
              (T.uap1 T.mkNoSrcPos p (gtoInteger T.mkNoSrcPos p)
                (T.uap1 T.mkNoSrcPos p (gord T.mkNoSrcPos p) fa))
              (T.uap1 T.mkNoSrcPos p (gtoInteger T.mkNoSrcPos p)
                (T.uap1 T.mkNoSrcPos p (gord T.mkNoSrcPos p) fb))) fg p))
    hrandomR _ _ p = T.fatal p
    
  
  grandom prandom p =
    T.ufun1 a113v3v113v42random prandom p hrandom
    where
    
    hrandom fg p =
      T.uap2 T.mkNoSrcPos p (grandomR T.mkNoSrcPos p)
        (T.con2 T.mkNoSrcPos p T.Tuple2 T.aTuple2 (gminBound T.mkNoSrcPos p)
          (gmaxBound T.mkNoSrcPos p)) fg
    
  

grandomIvalInteger ::
  (RandomGen g,Num a) =>
  T.RefSrcPos ->
    T.RefExp -> T.R (T.Fun (T.Tuple2 Integer Integer) (T.Fun g (T.Tuple2 a g)))

hrandomIvalInteger ::
  (RandomGen g,Num a) =>
  (T.R (T.Tuple2 Integer Integer)) -> (T.R g) -> T.RefExp -> T.R (T.Tuple2 a g)

grandomIvalInteger prandomIvalInteger p =
  T.ufun2 arandomIvalInteger prandomIvalInteger p hrandomIvalInteger

hrandomIvalInteger (T.R (T.Tuple2 fl fh) _) frng p =
  T.ucguard (T.uap2 T.mkNoSrcPos p (T.mkNoSrcPos !> p) fl fh)
    (T.uwrapForward p
      (hrandomIvalInteger (T.con2 T.mkNoSrcPos p T.Tuple2 T.aTuple2 fh fl) frng
        p))
    (T.ucguard (gotherwise T.mkNoSrcPos p)
      (T.uccase T.mkNoSrcPos p
        (let
          v120v16v120v83v1 (T.R (T.Tuple2 fv frng') _) p =
            T.con2 T.mkNoSrcPos p T.Tuple2 T.aTuple2
              (T.uap1 T.mkNoSrcPos p (gfromInteger T.mkNoSrcPos p)
                (T.uap2 T.mkNoSrcPos p (T.mkNoSrcPos !+ p) fl
                  (T.uap2 T.mkNoSrcPos p (gmod T.mkNoSrcPos p) fv
                    (gk T.mkNoSrcPos p)))) frng'
          v120v16v120v83v1 _ p = T.fatal p in (v120v16v120v83v1))
        (T.uwrapForward p
          (hf (gn T.mkNoSrcPos p)
            (T.uap1 T.mkNoSrcPos p
              (Hat.PreludeBasic.gfromInteger T.mkNoSrcPos p)
              (T.conInteger T.mkNoSrcPos p 1)) frng p))) (T.fatal p))
  where
  
  gk pk p = T.uconstUse pk p sk
  
  sk =
    T.uconstDef p a122v8v122v20k
      (\ p ->
        T.uap2 T.mkNoSrcPos p (T.mkNoSrcPos !+ p)
          (T.uap2 T.mkNoSrcPos p (T.mkNoSrcPos !- p) fh fl)
          (T.uap1 T.mkNoSrcPos p (Hat.PreludeBasic.gfromInteger T.mkNoSrcPos p)
            (T.conInteger T.mkNoSrcPos p 1)))
  
  gb pb p = T.uconstUse pb p sb
  
  sb =
    T.uconstDef p a123v8v123v21b
      (\ p ->
        T.uap1 T.mkNoSrcPos p (Hat.PreludeBasic.gfromInteger T.mkNoSrcPos p)
          (T.conInteger T.mkNoSrcPos p 2147483561))
  
  gn pn p = T.uconstUse pn p sn
  
  sn =
    T.uconstDef p a124v8v124v23n
      (\ p ->
        T.uwrapForward p (hiLogBase (gb T.mkNoSrcPos p) (gk T.mkNoSrcPos p) p))
  
  gf pf p = T.ufun3 a126v8v131v42f pf p hf
  
  af = a126v8v131v42f
  
  hf fv126v10v126v10n facc fg p =
    T.ucguard
      (T.uap2 T.mkNoSrcPos p (T.mkNoSrcPos Hat.Prelude.!== p) fv126v10v126v10n
        (T.uap1 T.mkNoSrcPos p (Hat.PreludeBasic.gfromInteger T.mkNoSrcPos p)
          (T.conInteger T.mkNoSrcPos p 0))) (h facc fg p)
      (y1f fv126v10v126v10n facc fg p)
    where
    
    h facc fg p = T.con2 T.mkNoSrcPos p T.Tuple2 T.aTuple2 facc fg
    h _ _ p = y1f fv126v10v126v10n facc fg p
    
  hf fv126v10v126v10n facc fg p = y1f fv126v10v126v10n facc fg p
  
  y1f fn facc fg p =
    let
      gx px p = T.uconstUse px p sx
      gg' px p = T.uconstUse px p sg'
      j129v12v129v17x =
        case T.uap1 T.mkNoSrcPos p (gnext T.mkNoSrcPos p) fg of
          T.R (T.Tuple2 fx fg') kx -> (kx,fx,fg')
          _ -> T.fatal p
      sx =
        T.uconstDef p a129v13v129v13x
          (\ _ -> case j129v12v129v17x of (kx,fx,fg') -> fx)
      sg' =
        T.uconstDef p a129v15v129v16g'
          (\ _ -> case j129v12v129v17x of (kx,fx,fg') -> fg') in
      (T.uwrapForward p
        (hf
          (T.uap2 T.mkNoSrcPos p (T.mkNoSrcPos !- p) fn
            (T.uap1 T.mkNoSrcPos p
              (Hat.PreludeBasic.gfromInteger T.mkNoSrcPos p)
              (T.conInteger T.mkNoSrcPos p 1)))
          (T.uap2 T.mkNoSrcPos p (T.mkNoSrcPos !+ p)
            (T.uap1 T.mkNoSrcPos p (gfromInt T.mkNoSrcPos p)
              (gx T.mkNoSrcPos p))
            (T.uap2 T.mkNoSrcPos p (T.mkNoSrcPos !* p) facc
              (gb T.mkNoSrcPos p))) (gg' T.mkNoSrcPos p) p))
  
hrandomIvalInteger _ _ p = T.fatal p

grandomIvalDouble ::
  (RandomGen g,Fractional a) =>
  T.RefSrcPos ->
    T.RefExp ->
      T.R
        (T.Fun (T.Tuple2 Double Double)
          (T.Fun (T.Fun Double a) (T.Fun g (T.Tuple2 a g))))

hrandomIvalDouble ::
  (RandomGen g,Fractional a) =>
  (T.R (T.Tuple2 Double Double)) ->
    (T.R (T.Fun Double a)) -> (T.R g) -> T.RefExp -> T.R (T.Tuple2 a g)

grandomIvalDouble prandomIvalDouble p =
  T.ufun3 arandomIvalDouble prandomIvalDouble p hrandomIvalDouble

hrandomIvalDouble (T.R (T.Tuple2 fl fh) _) ffromDouble frng p =
  T.ucguard (T.uap2 T.mkNoSrcPos p (T.mkNoSrcPos !> p) fl fh)
    (T.uwrapForward p
      (hrandomIvalDouble (T.con2 T.mkNoSrcPos p T.Tuple2 T.aTuple2 fh fl)
        ffromDouble frng p))
    (T.ucguard (gotherwise T.mkNoSrcPos p)
      (T.uccase T.mkNoSrcPos p
        (let
          v137v8v145v28v1 (T.R (T.Tuple2 fx frng') _) p =
            let
              gscaled_x pscaled_x p = T.uconstUse pscaled_x p sscaled_x
              sscaled_x =
                T.uconstDef p a140v14v143v36scaled_x
                  (\ p ->
                    T.uap2 T.mkNoSrcPos p (T.mkNoSrcPos !+ p)
                      (T.uap1 T.mkNoSrcPos p ffromDouble
                        (T.uap2 T.mkNoSrcPos p (T.mkNoSrcPos !/ p)
                          (T.uap2 T.mkNoSrcPos p (T.mkNoSrcPos !+ p) fl fh)
                          (T.uap1 T.mkNoSrcPos p
                            (Hat.PreludeBasic.gfromInteger T.mkNoSrcPos p)
                            (T.conInteger T.mkNoSrcPos p 2))))
                      (T.uap2 T.mkNoSrcPos p (T.mkNoSrcPos !* p)
                        (T.uap1 T.mkNoSrcPos p ffromDouble
                          (T.uap2 T.mkNoSrcPos p (T.mkNoSrcPos !/ p)
                            (T.uap2 T.mkNoSrcPos p (T.mkNoSrcPos !- p) fh fl)
                            (T.uap1 T.mkNoSrcPos p (grealToFrac T.mkNoSrcPos p)
                              (gintRange T.mkNoSrcPos p))))
                        (T.uap1 T.mkNoSrcPos p (gfromIntegral T.mkNoSrcPos p)
                          (fx :: T.R Int)))) in
              (T.con2 T.mkNoSrcPos p T.Tuple2 T.aTuple2
                (gscaled_x T.mkNoSrcPos p) frng')
          v137v8v145v28v1 _ p = T.fatal p in (v137v8v145v28v1))
        (T.uwrapForward p
          (hrandomIvalInteger
            (T.con2 T.mkNoSrcPos p T.Tuple2 T.aTuple2
              (T.uap1 T.mkNoSrcPos p (gtoInteger T.mkNoSrcPos p)
                (gminBound T.mkNoSrcPos p :: T.R Int))
              (T.uap1 T.mkNoSrcPos p (gtoInteger T.mkNoSrcPos p)
                (gmaxBound T.mkNoSrcPos p :: T.R Int))) frng p))) (T.fatal p))
hrandomIvalDouble _ _ _ p = T.fatal p

gfromInt :: Num a => T.RefSrcPos -> T.RefExp -> T.R (T.Fun Int a)

sfromInt :: Num a => T.R (T.Fun Int a)

gfromInt pfromInt p = T.uconstUse pfromInt p sfromInt

sfromInt =
  T.uconstDef T.mkRoot afromInt
    (\ p ->
      T.uap2 T.mkNoSrcPos p (T.mkNoSrcPos !. p) (gfromInteger T.mkNoSrcPos p)
        (gtoInteger T.mkNoSrcPos p))

gintRange :: T.RefSrcPos -> T.RefExp -> T.R Integer

sintRange :: T.R Integer

gintRange pintRange p = T.uconstUse pintRange p sintRange

sintRange =
  T.uconstDef T.mkRoot aintRange
    (\ p ->
      T.uap2 T.mkNoSrcPos p (T.mkNoSrcPos !- p)
        (T.uap1 T.mkNoSrcPos p (gtoInteger T.mkNoSrcPos p)
          (gmaxBound T.mkNoSrcPos p :: T.R Int))
        (T.uap1 T.mkNoSrcPos p (gtoInteger T.mkNoSrcPos p)
          (gminBound T.mkNoSrcPos p :: T.R Int)))

giLogBase ::
  T.RefSrcPos -> T.RefExp -> T.R (T.Fun Integer (T.Fun Integer Integer))

hiLogBase :: (T.R Integer) -> (T.R Integer) -> T.RefExp -> T.R Integer

giLogBase piLogBase p = T.ufun2 aiLogBase piLogBase p hiLogBase

hiLogBase fb fi p =
  T.ucif p (T.uap2 T.mkNoSrcPos p (T.mkNoSrcPos !< p) fi fb)
    (T.uap1 T.mkNoSrcPos p (Hat.PreludeBasic.gfromInteger T.mkNoSrcPos p)
      (T.conInteger T.mkNoSrcPos p 1))
    (T.uap2 T.mkNoSrcPos p (T.mkNoSrcPos !+ p)
      (T.uap1 T.mkNoSrcPos p (Hat.PreludeBasic.gfromInteger T.mkNoSrcPos p)
        (T.conInteger T.mkNoSrcPos p 1))
      (T.uwrapForward p
        (hiLogBase fb (T.uap2 T.mkNoSrcPos p (gdiv T.mkNoSrcPos p) fi fb) p)))

gnewStdGen :: T.RefSrcPos -> T.RefExp -> T.R (IO StdGen)

gnewStdGen pnewStdGen p = T.uconstUse pnewStdGen p snewStdGen

snewStdGen =
  T.uconstDef T.mkRoot anewStdGen
    (\ p -> (T.fromIO fromStdGen) p Random.newStdGen)

gsetStdGen :: T.RefSrcPos -> T.RefExp -> T.R (T.Fun StdGen (IO T.Tuple0))

gsetStdGen psetStdGen p = T.ufun1 asetStdGen psetStdGen p hsetStdGen

hsetStdGen z1setStdGen ksetStdGen =
  (T.fromIO T.fromTuple0) ksetStdGen
    (Random.setStdGen (toStdGen ksetStdGen z1setStdGen))

ggetStdGen :: T.RefSrcPos -> T.RefExp -> T.R (IO StdGen)

ggetStdGen pgetStdGen p = T.uconstUse pgetStdGen p sgetStdGen

sgetStdGen =
  T.uconstDef T.mkRoot agetStdGen
    (\ p -> (T.fromIO fromStdGen) p Random.getStdGen)

ggetStdRandom ::
  T.RefSrcPos ->
    T.RefExp -> T.R (T.Fun (T.Fun StdGen (T.Tuple2 a StdGen)) (IO a))

ggetStdRandom pgetStdRandom p =
  T.ufun1 agetStdRandom pgetStdRandom p hgetStdRandom

hgetStdRandom z1getStdRandom kgetStdRandom =
  (T.fromIO T.fromId) kgetStdRandom
    (Random.getStdRandom
      ((toFun fromStdGen (T.toTuple2 T.toId toStdGen)) kgetStdRandom
        z1getStdRandom))

tRandom = T.mkModule "Random" "Random.hs" Prelude.False

aprimStdGenGenRange =
  T.mkVariable tRandom 410001 420041 3 1 "primStdGenGenRange" Prelude.False

aprimStdGenNext =
  T.mkVariable tRandom 430001 440040 3 1 "primStdGenNext" Prelude.False

aprimStdGenSplit =
  T.mkVariable tRandom 450001 460044 3 1 "primStdGenSplit" Prelude.False

aprimStdGenReadsPrec =
  T.mkVariable tRandom 470001 480042 3 2 "primStdGenReadsPrec" Prelude.False

aprimStdGenShowsPrec =
  T.mkVariable tRandom 490001 500057 3 3 "primStdGenShowsPrec" Prelude.False

amkStdGen = T.mkVariable tRandom 530001 540026 3 1 "mkStdGen" Prelude.False

arandomIvalInteger =
  T.mkVariable tRandom 1180001 1310042 3 2 "randomIvalInteger" Prelude.False

arandomIvalDouble =
  T.mkVariable tRandom 1340001 1450028 3 3 "randomIvalDouble" Prelude.False

afromInt = T.mkVariable tRandom 1480001 1480033 3 0 "fromInt" Prelude.False

aintRange = T.mkVariable tRandom 1510001 1510064 3 0 "intRange" Prelude.False

aiLogBase = T.mkVariable tRandom 1540001 1540061 3 2 "iLogBase" Prelude.False

anewStdGen = T.mkVariable tRandom 1580001 1590019 3 0 "newStdGen" Prelude.False

asetStdGen = T.mkVariable tRandom 1600001 1610029 3 1 "setStdGen" Prelude.False

agetStdGen = T.mkVariable tRandom 1620001 1630019 3 0 "getStdGen" Prelude.False

agetStdRandom =
  T.mkVariable tRandom 1640001 1650046 3 1 "getStdRandom" Prelude.False

a24v3v24v34genRange =
  T.mkVariable tRandom 240003 240034 3 1 "genRange" Prelude.False

a31v3v31v31genRange =
  T.mkVariable tRandom 310003 310031 3 0 "genRange" Prelude.False

a32v3v32v23next = T.mkVariable tRandom 320003 320023 3 0 "next" Prelude.False

a33v3v33v25split = T.mkVariable tRandom 330003 330025 3 0 "split" Prelude.False

a36v3v36v33readsPrec =
  T.mkVariable tRandom 360003 360033 3 0 "readsPrec" Prelude.False

a39v3v39v33showsPrec =
  T.mkVariable tRandom 390003 390033 3 0 "showsPrec" Prelude.False

a68v3v70v21randoms =
  T.mkVariable tRandom 680003 700021 3 1 "randoms" Prelude.False

a71v3v73v28randomRs =
  T.mkVariable tRandom 710003 730028 3 2 "randomRs" Prelude.False

a74v3v74v39randomIO =
  T.mkVariable tRandom 740003 740039 3 0 "randomIO" Prelude.False

a75v3v75v47randomRIO =
  T.mkVariable tRandom 750003 750047 3 1 "randomRIO" Prelude.False

a78v3v78v66randomR =
  T.mkVariable tRandom 780003 780066 3 2 "randomR" Prelude.False

a79v3v79v49random =
  T.mkVariable tRandom 790003 790049 3 1 "random" Prelude.False

a82v3v82v43randomR =
  T.mkVariable tRandom 820003 820043 3 2 "randomR" Prelude.False

a83v3v83v83random =
  T.mkVariable tRandom 830003 830083 3 1 "random" Prelude.False

a86v3v86v63random =
  T.mkVariable tRandom 860003 860063 3 1 "random" Prelude.False

a87v3v87v78randomR =
  T.mkVariable tRandom 870003 870078 3 2 "randomR" Prelude.False

a90v3v90v45randomR =
  T.mkVariable tRandom 900003 900045 3 2 "randomR" Prelude.False

a91v3v91v42random =
  T.mkVariable tRandom 910003 910042 3 1 "random" Prelude.False

a94v3v105v22randomR =
  T.mkVariable tRandom 940003 1050022 3 2 "randomR" Prelude.False

a107v3v107v42random =
  T.mkVariable tRandom 1070003 1070042 3 1 "random" Prelude.False

a110v3v112v27randomR =
  T.mkVariable tRandom 1100003 1120027 3 2 "randomR" Prelude.False

a113v3v113v42random =
  T.mkVariable tRandom 1130003 1130042 3 1 "random" Prelude.False

a70v6v70v6x = T.mkVariable tRandom 700006 700006 3 0 "x" Prelude.True

a70v8v70v9g' = T.mkVariable tRandom 700008 700009 3 0 "g'" Prelude.True

a73v6v73v6x = T.mkVariable tRandom 730006 730006 3 0 "x" Prelude.True

a73v8v73v9g' = T.mkVariable tRandom 730008 730009 3 0 "g'" Prelude.True

a100v5v101v26bool2Integer =
  T.mkVariable tRandom 1000005 1010026 3 1 "bool2Integer" Prelude.True

a104v5v105v22int2Bool =
  T.mkVariable tRandom 1040005 1050022 3 1 "int2Bool" Prelude.True

a122v8v122v20k = T.mkVariable tRandom 1220008 1220020 3 0 "k" Prelude.True

a123v8v123v21b = T.mkVariable tRandom 1230008 1230021 3 0 "b" Prelude.True

a124v8v124v23n = T.mkVariable tRandom 1240008 1240023 3 0 "n" Prelude.True

a126v8v131v42f = T.mkVariable tRandom 1260008 1310042 3 3 "f" Prelude.True

a129v13v129v13x = T.mkVariable tRandom 1290013 1290013 3 0 "x" Prelude.True

a129v15v129v16g' = T.mkVariable tRandom 1290015 1290016 3 0 "g'" Prelude.True

a140v14v143v36scaled_x =
  T.mkVariable tRandom 1400014 1430036 3 0 "scaled_x" Prelude.True