{-# LANGUAGE Unsafe #-}
{-# LANGUAGE CPP
, NoImplicitPrelude
, BangPatterns
, ExplicitForAll
, MagicHash
, UnboxedTuples
, ExistentialQuantification
, RankNTypes
, KindSignatures
, PolyKinds
, DataKinds
#-}
{-# OPTIONS_GHC -Wno-orphans #-}
{-# OPTIONS_HADDOCK not-home #-}
#include "MachDeps.h"
module GHC.Base
(
module GHC.Base,
module GHC.Classes,
module GHC.CString,
module GHC.Magic,
module GHC.Types,
module GHC.Prim,
module GHC.Err,
module GHC.Maybe
)
where
import GHC.Types
import GHC.Classes
import GHC.CString
import GHC.Magic
import GHC.Prim
import GHC.Err
import GHC.Maybe
import {-# SOURCE #-} GHC.IO (failIO,mplusIO)
import GHC.Tuple ()
import GHC.Integer ()
import GHC.Natural ()
import {-# SOURCE #-} GHC.Real (Integral)
import {-# SOURCE #-} Data.Semigroup.Internal ( stimesDefault
, stimesMaybe
, stimesList
, stimesIdempotentMonoid
)
infixr 9 .
infixr 5 ++
infixl 4 <$
infixl 1 >>, >>=
infixr 1 =<<
infixr 0 $, $!
infixl 4 <*>, <*, *>, <**>
default ()
#if 0
data Bool = False | True
data Ordering = LT | EQ | GT
data Char = C# Char#
type String = [Char]
data Int = I# Int#
data () = ()
data [] a = MkNil
not True = False
(&&) True True = True
otherwise = True
build = errorWithoutStackTrace "urk"
foldr = errorWithoutStackTrace "urk"
#endif
infixr 6 <>
class Semigroup a where
(<>) :: a -> a -> a
sconcat :: NonEmpty a -> a
sconcat (a :: a
a :| as :: [a]
as) = a -> [a] -> a
forall t. Semigroup t => t -> [t] -> t
go a
a [a]
as where
go :: t -> [t] -> t
go b :: t
b (c :: t
c:cs :: [t]
cs) = t
b t -> t -> t
forall a. Semigroup a => a -> a -> a
<> t -> [t] -> t
go t
c [t]
cs
go b :: t
b [] = t
b
stimes :: Integral b => b -> a -> a
stimes = b -> a -> a
forall b a. (Integral b, Semigroup a) => b -> a -> a
stimesDefault
class Semigroup a => Monoid a where
mempty :: a
mappend :: a -> a -> a
mappend = a -> a -> a
forall a. Semigroup a => a -> a -> a
(<>)
{-# INLINE mappend #-}
mconcat :: [a] -> a
mconcat = (a -> a -> a) -> a -> [a] -> a
forall a b. (a -> b -> b) -> b -> [a] -> b
foldr a -> a -> a
forall a. Monoid a => a -> a -> a
mappend a
forall a. Monoid a => a
mempty
instance Semigroup [a] where
<> :: [a] -> [a] -> [a]
(<>) = [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
(++)
{-# INLINE (<>) #-}
stimes :: b -> [a] -> [a]
stimes = b -> [a] -> [a]
forall b a. Integral b => b -> [a] -> [a]
stimesList
instance Monoid [a] where
{-# INLINE mempty #-}
mempty :: [a]
mempty = []
{-# INLINE mconcat #-}
mconcat :: [[a]] -> [a]
mconcat xss :: [[a]]
xss = [a
x | [a]
xs <- [[a]]
xss, a
x <- [a]
xs]
instance Semigroup (NonEmpty a) where
(a :: a
a :| as :: [a]
as) <> :: NonEmpty a -> NonEmpty a -> NonEmpty a
<> ~(b :: a
b :| bs :: [a]
bs) = a
a a -> [a] -> NonEmpty a
forall a. a -> [a] -> NonEmpty a
:| ([a]
as [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ a
b a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
bs)
instance Semigroup b => Semigroup (a -> b) where
f :: a -> b
f <> :: (a -> b) -> (a -> b) -> a -> b
<> g :: a -> b
g = \x :: a
x -> a -> b
f a
x b -> b -> b
forall a. Semigroup a => a -> a -> a
<> a -> b
g a
x
stimes :: b -> (a -> b) -> a -> b
stimes n :: b
n f :: a -> b
f e :: a
e = b -> b -> b
forall a b. (Semigroup a, Integral b) => b -> a -> a
stimes b
n (a -> b
f a
e)
instance Monoid b => Monoid (a -> b) where
mempty :: a -> b
mempty _ = b
forall a. Monoid a => a
mempty
instance Semigroup () where
_ <> :: () -> () -> ()
<> _ = ()
sconcat :: NonEmpty () -> ()
sconcat _ = ()
stimes :: b -> () -> ()
stimes _ _ = ()
instance Monoid () where
mempty :: ()
mempty = ()
mconcat :: [()] -> ()
mconcat _ = ()
instance (Semigroup a, Semigroup b) => Semigroup (a, b) where
(a :: a
a,b :: b
b) <> :: (a, b) -> (a, b) -> (a, b)
<> (a' :: a
a',b' :: b
b') = (a
aa -> a -> a
forall a. Semigroup a => a -> a -> a
<>a
a',b
bb -> b -> b
forall a. Semigroup a => a -> a -> a
<>b
b')
stimes :: b -> (a, b) -> (a, b)
stimes n :: b
n (a :: a
a,b :: b
b) = (b -> a -> a
forall a b. (Semigroup a, Integral b) => b -> a -> a
stimes b
n a
a, b -> b -> b
forall a b. (Semigroup a, Integral b) => b -> a -> a
stimes b
n b
b)
instance (Monoid a, Monoid b) => Monoid (a,b) where
mempty :: (a, b)
mempty = (a
forall a. Monoid a => a
mempty, b
forall a. Monoid a => a
mempty)
instance (Semigroup a, Semigroup b, Semigroup c) => Semigroup (a, b, c) where
(a :: a
a,b :: b
b,c :: c
c) <> :: (a, b, c) -> (a, b, c) -> (a, b, c)
<> (a' :: a
a',b' :: b
b',c' :: c
c') = (a
aa -> a -> a
forall a. Semigroup a => a -> a -> a
<>a
a',b
bb -> b -> b
forall a. Semigroup a => a -> a -> a
<>b
b',c
cc -> c -> c
forall a. Semigroup a => a -> a -> a
<>c
c')
stimes :: b -> (a, b, c) -> (a, b, c)
stimes n :: b
n (a :: a
a,b :: b
b,c :: c
c) = (b -> a -> a
forall a b. (Semigroup a, Integral b) => b -> a -> a
stimes b
n a
a, b -> b -> b
forall a b. (Semigroup a, Integral b) => b -> a -> a
stimes b
n b
b, b -> c -> c
forall a b. (Semigroup a, Integral b) => b -> a -> a
stimes b
n c
c)
instance (Monoid a, Monoid b, Monoid c) => Monoid (a,b,c) where
mempty :: (a, b, c)
mempty = (a
forall a. Monoid a => a
mempty, b
forall a. Monoid a => a
mempty, c
forall a. Monoid a => a
mempty)
instance (Semigroup a, Semigroup b, Semigroup c, Semigroup d)
=> Semigroup (a, b, c, d) where
(a :: a
a,b :: b
b,c :: c
c,d :: d
d) <> :: (a, b, c, d) -> (a, b, c, d) -> (a, b, c, d)
<> (a' :: a
a',b' :: b
b',c' :: c
c',d' :: d
d') = (a
aa -> a -> a
forall a. Semigroup a => a -> a -> a
<>a
a',b
bb -> b -> b
forall a. Semigroup a => a -> a -> a
<>b
b',c
cc -> c -> c
forall a. Semigroup a => a -> a -> a
<>c
c',d
dd -> d -> d
forall a. Semigroup a => a -> a -> a
<>d
d')
stimes :: b -> (a, b, c, d) -> (a, b, c, d)
stimes n :: b
n (a :: a
a,b :: b
b,c :: c
c,d :: d
d) = (b -> a -> a
forall a b. (Semigroup a, Integral b) => b -> a -> a
stimes b
n a
a, b -> b -> b
forall a b. (Semigroup a, Integral b) => b -> a -> a
stimes b
n b
b, b -> c -> c
forall a b. (Semigroup a, Integral b) => b -> a -> a
stimes b
n c
c, b -> d -> d
forall a b. (Semigroup a, Integral b) => b -> a -> a
stimes b
n d
d)
instance (Monoid a, Monoid b, Monoid c, Monoid d) => Monoid (a,b,c,d) where
mempty :: (a, b, c, d)
mempty = (a
forall a. Monoid a => a
mempty, b
forall a. Monoid a => a
mempty, c
forall a. Monoid a => a
mempty, d
forall a. Monoid a => a
mempty)
instance (Semigroup a, Semigroup b, Semigroup c, Semigroup d, Semigroup e)
=> Semigroup (a, b, c, d, e) where
(a :: a
a,b :: b
b,c :: c
c,d :: d
d,e :: e
e) <> :: (a, b, c, d, e) -> (a, b, c, d, e) -> (a, b, c, d, e)
<> (a' :: a
a',b' :: b
b',c' :: c
c',d' :: d
d',e' :: e
e') = (a
aa -> a -> a
forall a. Semigroup a => a -> a -> a
<>a
a',b
bb -> b -> b
forall a. Semigroup a => a -> a -> a
<>b
b',c
cc -> c -> c
forall a. Semigroup a => a -> a -> a
<>c
c',d
dd -> d -> d
forall a. Semigroup a => a -> a -> a
<>d
d',e
ee -> e -> e
forall a. Semigroup a => a -> a -> a
<>e
e')
stimes :: b -> (a, b, c, d, e) -> (a, b, c, d, e)
stimes n :: b
n (a :: a
a,b :: b
b,c :: c
c,d :: d
d,e :: e
e) =
(b -> a -> a
forall a b. (Semigroup a, Integral b) => b -> a -> a
stimes b
n a
a, b -> b -> b
forall a b. (Semigroup a, Integral b) => b -> a -> a
stimes b
n b
b, b -> c -> c
forall a b. (Semigroup a, Integral b) => b -> a -> a
stimes b
n c
c, b -> d -> d
forall a b. (Semigroup a, Integral b) => b -> a -> a
stimes b
n d
d, b -> e -> e
forall a b. (Semigroup a, Integral b) => b -> a -> a
stimes b
n e
e)
instance (Monoid a, Monoid b, Monoid c, Monoid d, Monoid e) =>
Monoid (a,b,c,d,e) where
mempty :: (a, b, c, d, e)
mempty = (a
forall a. Monoid a => a
mempty, b
forall a. Monoid a => a
mempty, c
forall a. Monoid a => a
mempty, d
forall a. Monoid a => a
mempty, e
forall a. Monoid a => a
mempty)
instance Semigroup Ordering where
LT <> :: Ordering -> Ordering -> Ordering
<> _ = Ordering
LT
EQ <> y :: Ordering
y = Ordering
y
GT <> _ = Ordering
GT
stimes :: b -> Ordering -> Ordering
stimes = b -> Ordering -> Ordering
forall b a. (Integral b, Monoid a) => b -> a -> a
stimesIdempotentMonoid
instance Monoid Ordering where
mempty :: Ordering
mempty = Ordering
EQ
instance Semigroup a => Semigroup (Maybe a) where
Nothing <> :: Maybe a -> Maybe a -> Maybe a
<> b :: Maybe a
b = Maybe a
b
a :: Maybe a
a <> Nothing = Maybe a
a
Just a :: a
a <> Just b :: a
b = a -> Maybe a
forall a. a -> Maybe a
Just (a
a a -> a -> a
forall a. Semigroup a => a -> a -> a
<> a
b)
stimes :: b -> Maybe a -> Maybe a
stimes = b -> Maybe a -> Maybe a
forall b a. (Integral b, Semigroup a) => b -> Maybe a -> Maybe a
stimesMaybe
instance Semigroup a => Monoid (Maybe a) where
mempty :: Maybe a
mempty = Maybe a
forall a. Maybe a
Nothing
instance Monoid a => Applicative ((,) a) where
pure :: a -> (a, a)
pure x :: a
x = (a
forall a. Monoid a => a
mempty, a
x)
(u :: a
u, f :: a -> b
f) <*> :: (a, a -> b) -> (a, a) -> (a, b)
<*> (v :: a
v, x :: a
x) = (a
u a -> a -> a
forall a. Semigroup a => a -> a -> a
<> a
v, a -> b
f a
x)
liftA2 :: (a -> b -> c) -> (a, a) -> (a, b) -> (a, c)
liftA2 f :: a -> b -> c
f (u :: a
u, x :: a
x) (v :: a
v, y :: b
y) = (a
u a -> a -> a
forall a. Semigroup a => a -> a -> a
<> a
v, a -> b -> c
f a
x b
y)
instance Monoid a => Monad ((,) a) where
(u :: a
u, a :: a
a) >>= :: (a, a) -> (a -> (a, b)) -> (a, b)
>>= k :: a -> (a, b)
k = case a -> (a, b)
k a
a of (v :: a
v, b :: b
b) -> (a
u a -> a -> a
forall a. Semigroup a => a -> a -> a
<> a
v, b
b)
instance Semigroup a => Semigroup (IO a) where
<> :: IO a -> IO a -> IO a
(<>) = (a -> a -> a) -> IO a -> IO a -> IO a
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 a -> a -> a
forall a. Semigroup a => a -> a -> a
(<>)
instance Monoid a => Monoid (IO a) where
mempty :: IO a
mempty = a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
forall a. Monoid a => a
mempty
class Functor f where
fmap :: (a -> b) -> f a -> f b
(<$) :: a -> f b -> f a
(<$) = (b -> a) -> f b -> f a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((b -> a) -> f b -> f a) -> (a -> b -> a) -> a -> f b -> f a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> b -> a
forall a b. a -> b -> a
const
class Functor f => Applicative f where
{-# MINIMAL pure, ((<*>) | liftA2) #-}
pure :: a -> f a
(<*>) :: f (a -> b) -> f a -> f b
(<*>) = ((a -> b) -> a -> b) -> f (a -> b) -> f a -> f b
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 (a -> b) -> a -> b
forall a. a -> a
id
liftA2 :: (a -> b -> c) -> f a -> f b -> f c
liftA2 f :: a -> b -> c
f x :: f a
x = f (b -> c) -> f b -> f c
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
(<*>) ((a -> b -> c) -> f a -> f (b -> c)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b -> c
f f a
x)
(*>) :: f a -> f b -> f b
a1 :: f a
a1 *> a2 :: f b
a2 = (b -> b
forall a. a -> a
id (b -> b) -> f a -> f (b -> b)
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ f a
a1) f (b -> b) -> f b -> f b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> f b
a2
(<*) :: f a -> f b -> f a
(<*) = (a -> b -> a) -> f a -> f b -> f a
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 a -> b -> a
forall a b. a -> b -> a
const
(<**>) :: Applicative f => f a -> f (a -> b) -> f b
<**> :: f a -> f (a -> b) -> f b
(<**>) = (a -> (a -> b) -> b) -> f a -> f (a -> b) -> f b
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 (\a :: a
a f :: a -> b
f -> a -> b
f a
a)
liftA :: Applicative f => (a -> b) -> f a -> f b
liftA :: (a -> b) -> f a -> f b
liftA f :: a -> b
f a :: f a
a = (a -> b) -> f (a -> b)
forall (f :: * -> *) a. Applicative f => a -> f a
pure a -> b
f f (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> f a
a
liftA3 :: Applicative f => (a -> b -> c -> d) -> f a -> f b -> f c -> f d
liftA3 :: (a -> b -> c -> d) -> f a -> f b -> f c -> f d
liftA3 f :: a -> b -> c -> d
f a :: f a
a b :: f b
b c :: f c
c = (a -> b -> c -> d) -> f a -> f b -> f (c -> d)
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 a -> b -> c -> d
f f a
a f b
b f (c -> d) -> f c -> f d
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> f c
c
{-# INLINABLE liftA #-}
{-# SPECIALISE liftA :: (a1->r) -> IO a1 -> IO r #-}
{-# SPECIALISE liftA :: (a1->r) -> Maybe a1 -> Maybe r #-}
{-# INLINABLE liftA3 #-}
{-# SPECIALISE liftA3 :: (a1->a2->a3->r) -> IO a1 -> IO a2 -> IO a3 -> IO r #-}
{-# SPECIALISE liftA3 :: (a1->a2->a3->r) ->
Maybe a1 -> Maybe a2 -> Maybe a3 -> Maybe r #-}
join :: (Monad m) => m (m a) -> m a
join :: m (m a) -> m a
join x :: m (m a)
x = m (m a)
x m (m a) -> (m a -> m a) -> m a
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= m a -> m a
forall a. a -> a
id
class Applicative m => Monad m where
(>>=) :: forall a b. m a -> (a -> m b) -> m b
(>>) :: forall a b. m a -> m b -> m b
m :: m a
m >> k :: m b
k = m a
m m a -> (a -> m b) -> m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \_ -> m b
k
{-# INLINE (>>) #-}
return :: a -> m a
return = a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
{-# SPECIALISE (=<<) :: (a -> [b]) -> [a] -> [b] #-}
(=<<) :: Monad m => (a -> m b) -> m a -> m b
f :: a -> m b
f =<< :: (a -> m b) -> m a -> m b
=<< x :: m a
x = m a
x m a -> (a -> m b) -> m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= a -> m b
f
when :: (Applicative f) => Bool -> f () -> f ()
{-# INLINABLE when #-}
{-# SPECIALISE when :: Bool -> IO () -> IO () #-}
{-# SPECIALISE when :: Bool -> Maybe () -> Maybe () #-}
when :: Bool -> f () -> f ()
when p :: Bool
p s :: f ()
s = if Bool
p then f ()
s else () -> f ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
sequence :: Monad m => [m a] -> m [a]
{-# INLINE sequence #-}
sequence :: [m a] -> m [a]
sequence = (m a -> m a) -> [m a] -> m [a]
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM m a -> m a
forall a. a -> a
id
mapM :: Monad m => (a -> m b) -> [a] -> m [b]
{-# INLINE mapM #-}
mapM :: (a -> m b) -> [a] -> m [b]
mapM f :: a -> m b
f as :: [a]
as = (a -> m [b] -> m [b]) -> m [b] -> [a] -> m [b]
forall a b. (a -> b -> b) -> b -> [a] -> b
foldr a -> m [b] -> m [b]
k ([b] -> m [b]
forall (m :: * -> *) a. Monad m => a -> m a
return []) [a]
as
where
k :: a -> m [b] -> m [b]
k a :: a
a r :: m [b]
r = do { b
x <- a -> m b
f a
a; [b]
xs <- m [b]
r; [b] -> m [b]
forall (m :: * -> *) a. Monad m => a -> m a
return (b
xb -> [b] -> [b]
forall a. a -> [a] -> [a]
:[b]
xs) }
liftM :: (Monad m) => (a1 -> r) -> m a1 -> m r
liftM :: (a1 -> r) -> m a1 -> m r
liftM f :: a1 -> r
f m1 :: m a1
m1 = do { a1
x1 <- m a1
m1; r -> m r
forall (m :: * -> *) a. Monad m => a -> m a
return (a1 -> r
f a1
x1) }
liftM2 :: (Monad m) => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r
liftM2 :: (a1 -> a2 -> r) -> m a1 -> m a2 -> m r
liftM2 f :: a1 -> a2 -> r
f m1 :: m a1
m1 m2 :: m a2
m2 = do { a1
x1 <- m a1
m1; a2
x2 <- m a2
m2; r -> m r
forall (m :: * -> *) a. Monad m => a -> m a
return (a1 -> a2 -> r
f a1
x1 a2
x2) }
liftM3 :: (Monad m) => (a1 -> a2 -> a3 -> r) -> m a1 -> m a2 -> m a3 -> m r
liftM3 :: (a1 -> a2 -> a3 -> r) -> m a1 -> m a2 -> m a3 -> m r
liftM3 f :: a1 -> a2 -> a3 -> r
f m1 :: m a1
m1 m2 :: m a2
m2 m3 :: m a3
m3 = do { a1
x1 <- m a1
m1; a2
x2 <- m a2
m2; a3
x3 <- m a3
m3; r -> m r
forall (m :: * -> *) a. Monad m => a -> m a
return (a1 -> a2 -> a3 -> r
f a1
x1 a2
x2 a3
x3) }
liftM4 :: (Monad m) => (a1 -> a2 -> a3 -> a4 -> r) -> m a1 -> m a2 -> m a3 -> m a4 -> m r
liftM4 :: (a1 -> a2 -> a3 -> a4 -> r) -> m a1 -> m a2 -> m a3 -> m a4 -> m r
liftM4 f :: a1 -> a2 -> a3 -> a4 -> r
f m1 :: m a1
m1 m2 :: m a2
m2 m3 :: m a3
m3 m4 :: m a4
m4 = do { a1
x1 <- m a1
m1; a2
x2 <- m a2
m2; a3
x3 <- m a3
m3; a4
x4 <- m a4
m4; r -> m r
forall (m :: * -> *) a. Monad m => a -> m a
return (a1 -> a2 -> a3 -> a4 -> r
f a1
x1 a2
x2 a3
x3 a4
x4) }
liftM5 :: (Monad m) => (a1 -> a2 -> a3 -> a4 -> a5 -> r) -> m a1 -> m a2 -> m a3 -> m a4 -> m a5 -> m r
liftM5 :: (a1 -> a2 -> a3 -> a4 -> a5 -> r)
-> m a1 -> m a2 -> m a3 -> m a4 -> m a5 -> m r
liftM5 f :: a1 -> a2 -> a3 -> a4 -> a5 -> r
f m1 :: m a1
m1 m2 :: m a2
m2 m3 :: m a3
m3 m4 :: m a4
m4 m5 :: m a5
m5 = do { a1
x1 <- m a1
m1; a2
x2 <- m a2
m2; a3
x3 <- m a3
m3; a4
x4 <- m a4
m4; a5
x5 <- m a5
m5; r -> m r
forall (m :: * -> *) a. Monad m => a -> m a
return (a1 -> a2 -> a3 -> a4 -> a5 -> r
f a1
x1 a2
x2 a3
x3 a4
x4 a5
x5) }
{-# INLINABLE liftM #-}
{-# SPECIALISE liftM :: (a1->r) -> IO a1 -> IO r #-}
{-# SPECIALISE liftM :: (a1->r) -> Maybe a1 -> Maybe r #-}
{-# INLINABLE liftM2 #-}
{-# SPECIALISE liftM2 :: (a1->a2->r) -> IO a1 -> IO a2 -> IO r #-}
{-# SPECIALISE liftM2 :: (a1->a2->r) -> Maybe a1 -> Maybe a2 -> Maybe r #-}
{-# INLINABLE liftM3 #-}
{-# SPECIALISE liftM3 :: (a1->a2->a3->r) -> IO a1 -> IO a2 -> IO a3 -> IO r #-}
{-# SPECIALISE liftM3 :: (a1->a2->a3->r) -> Maybe a1 -> Maybe a2 -> Maybe a3 -> Maybe r #-}
{-# INLINABLE liftM4 #-}
{-# SPECIALISE liftM4 :: (a1->a2->a3->a4->r) -> IO a1 -> IO a2 -> IO a3 -> IO a4 -> IO r #-}
{-# SPECIALISE liftM4 :: (a1->a2->a3->a4->r) -> Maybe a1 -> Maybe a2 -> Maybe a3 -> Maybe a4 -> Maybe r #-}
{-# INLINABLE liftM5 #-}
{-# SPECIALISE liftM5 :: (a1->a2->a3->a4->a5->r) -> IO a1 -> IO a2 -> IO a3 -> IO a4 -> IO a5 -> IO r #-}
{-# SPECIALISE liftM5 :: (a1->a2->a3->a4->a5->r) -> Maybe a1 -> Maybe a2 -> Maybe a3 -> Maybe a4 -> Maybe a5 -> Maybe r #-}
ap :: (Monad m) => m (a -> b) -> m a -> m b
ap :: m (a -> b) -> m a -> m b
ap m1 :: m (a -> b)
m1 m2 :: m a
m2 = do { a -> b
x1 <- m (a -> b)
m1; a
x2 <- m a
m2; b -> m b
forall (m :: * -> *) a. Monad m => a -> m a
return (a -> b
x1 a
x2) }
{-# INLINABLE ap #-}
{-# SPECIALISE ap :: IO (a -> b) -> IO a -> IO b #-}
{-# SPECIALISE ap :: Maybe (a -> b) -> Maybe a -> Maybe b #-}
instance Functor ((->) r) where
fmap :: (a -> b) -> (r -> a) -> r -> b
fmap = (a -> b) -> (r -> a) -> r -> b
forall b c a. (b -> c) -> (a -> b) -> a -> c
(.)
instance Applicative ((->) a) where
pure :: a -> a -> a
pure = a -> a -> a
forall a b. a -> b -> a
const
<*> :: (a -> a -> b) -> (a -> a) -> a -> b
(<*>) f :: a -> a -> b
f g :: a -> a
g x :: a
x = a -> a -> b
f a
x (a -> a
g a
x)
liftA2 :: (a -> b -> c) -> (a -> a) -> (a -> b) -> a -> c
liftA2 q :: a -> b -> c
q f :: a -> a
f g :: a -> b
g x :: a
x = a -> b -> c
q (a -> a
f a
x) (a -> b
g a
x)
instance Monad ((->) r) where
f :: r -> a
f >>= :: (r -> a) -> (a -> r -> b) -> r -> b
>>= k :: a -> r -> b
k = \ r :: r
r -> a -> r -> b
k (r -> a
f r
r) r
r
instance Functor ((,) a) where
fmap :: (a -> b) -> (a, a) -> (a, b)
fmap f :: a -> b
f (x :: a
x,y :: a
y) = (a
x, a -> b
f a
y)
instance Functor Maybe where
fmap :: (a -> b) -> Maybe a -> Maybe b
fmap _ Nothing = Maybe b
forall a. Maybe a
Nothing
fmap f :: a -> b
f (Just a :: a
a) = b -> Maybe b
forall a. a -> Maybe a
Just (a -> b
f a
a)
instance Applicative Maybe where
pure :: a -> Maybe a
pure = a -> Maybe a
forall a. a -> Maybe a
Just
Just f :: a -> b
f <*> :: Maybe (a -> b) -> Maybe a -> Maybe b
<*> m :: Maybe a
m = (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f Maybe a
m
Nothing <*> _m :: Maybe a
_m = Maybe b
forall a. Maybe a
Nothing
liftA2 :: (a -> b -> c) -> Maybe a -> Maybe b -> Maybe c
liftA2 f :: a -> b -> c
f (Just x :: a
x) (Just y :: b
y) = c -> Maybe c
forall a. a -> Maybe a
Just (a -> b -> c
f a
x b
y)
liftA2 _ _ _ = Maybe c
forall a. Maybe a
Nothing
Just _m1 :: a
_m1 *> :: Maybe a -> Maybe b -> Maybe b
*> m2 :: Maybe b
m2 = Maybe b
m2
Nothing *> _m2 :: Maybe b
_m2 = Maybe b
forall a. Maybe a
Nothing
instance Monad Maybe where
(Just x :: a
x) >>= :: Maybe a -> (a -> Maybe b) -> Maybe b
>>= k :: a -> Maybe b
k = a -> Maybe b
k a
x
Nothing >>= _ = Maybe b
forall a. Maybe a
Nothing
>> :: Maybe a -> Maybe b -> Maybe b
(>>) = Maybe a -> Maybe b -> Maybe b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
(*>)
infixl 3 <|>
class Applicative f => Alternative f where
empty :: f a
(<|>) :: f a -> f a -> f a
some :: f a -> f [a]
some v :: f a
v = f [a]
some_v
where
many_v :: f [a]
many_v = f [a]
some_v f [a] -> f [a] -> f [a]
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> [a] -> f [a]
forall (f :: * -> *) a. Applicative f => a -> f a
pure []
some_v :: f [a]
some_v = (a -> [a] -> [a]) -> f a -> f [a] -> f [a]
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 (:) f a
v f [a]
many_v
many :: f a -> f [a]
many v :: f a
v = f [a]
many_v
where
many_v :: f [a]
many_v = f [a]
some_v f [a] -> f [a] -> f [a]
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> [a] -> f [a]
forall (f :: * -> *) a. Applicative f => a -> f a
pure []
some_v :: f [a]
some_v = (a -> [a] -> [a]) -> f a -> f [a] -> f [a]
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 (:) f a
v f [a]
many_v
instance Alternative Maybe where
empty :: Maybe a
empty = Maybe a
forall a. Maybe a
Nothing
Nothing <|> :: Maybe a -> Maybe a -> Maybe a
<|> r :: Maybe a
r = Maybe a
r
l :: Maybe a
l <|> _ = Maybe a
l
class (Alternative m, Monad m) => MonadPlus m where
mzero :: m a
mzero = m a
forall (f :: * -> *) a. Alternative f => f a
empty
mplus :: m a -> m a -> m a
mplus = m a -> m a -> m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
(<|>)
instance MonadPlus Maybe
infixr 5 :|
data NonEmpty a = a :| [a]
deriving ( Eq
, Ord
)
instance Functor NonEmpty where
fmap :: (a -> b) -> NonEmpty a -> NonEmpty b
fmap f :: a -> b
f ~(a :: a
a :| as :: [a]
as) = a -> b
f a
a b -> [b] -> NonEmpty b
forall a. a -> [a] -> NonEmpty a
:| (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f [a]
as
b :: a
b <$ :: a -> NonEmpty b -> NonEmpty a
<$ ~(_ :| as :: [b]
as) = a
b a -> [a] -> NonEmpty a
forall a. a -> [a] -> NonEmpty a
:| (a
b a -> [b] -> [a]
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ [b]
as)
instance Applicative NonEmpty where
pure :: a -> NonEmpty a
pure a :: a
a = a
a a -> [a] -> NonEmpty a
forall a. a -> [a] -> NonEmpty a
:| []
<*> :: NonEmpty (a -> b) -> NonEmpty a -> NonEmpty b
(<*>) = NonEmpty (a -> b) -> NonEmpty a -> NonEmpty b
forall (m :: * -> *) a b. Monad m => m (a -> b) -> m a -> m b
ap
liftA2 :: (a -> b -> c) -> NonEmpty a -> NonEmpty b -> NonEmpty c
liftA2 = (a -> b -> c) -> NonEmpty a -> NonEmpty b -> NonEmpty c
forall (m :: * -> *) a1 a2 r.
Monad m =>
(a1 -> a2 -> r) -> m a1 -> m a2 -> m r
liftM2
instance Monad NonEmpty where
~(a :: a
a :| as :: [a]
as) >>= :: NonEmpty a -> (a -> NonEmpty b) -> NonEmpty b
>>= f :: a -> NonEmpty b
f = b
b b -> [b] -> NonEmpty b
forall a. a -> [a] -> NonEmpty a
:| ([b]
bs [b] -> [b] -> [b]
forall a. [a] -> [a] -> [a]
++ [b]
bs')
where b :: b
b :| bs :: [b]
bs = a -> NonEmpty b
f a
a
bs' :: [b]
bs' = [a]
as [a] -> (a -> [b]) -> [b]
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= NonEmpty b -> [b]
forall a. NonEmpty a -> [a]
toList (NonEmpty b -> [b]) -> (a -> NonEmpty b) -> a -> [b]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> NonEmpty b
f
toList :: NonEmpty a -> [a]
toList ~(c :: a
c :| cs :: [a]
cs) = a
c a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
cs
instance Functor [] where
{-# INLINE fmap #-}
fmap :: (a -> b) -> [a] -> [b]
fmap = (a -> b) -> [a] -> [b]
forall a b. (a -> b) -> [a] -> [b]
map
instance Applicative [] where
{-# INLINE pure #-}
pure :: a -> [a]
pure x :: a
x = [a
x]
{-# INLINE (<*>) #-}
fs :: [a -> b]
fs <*> :: [a -> b] -> [a] -> [b]
<*> xs :: [a]
xs = [a -> b
f a
x | a -> b
f <- [a -> b]
fs, a
x <- [a]
xs]
{-# INLINE liftA2 #-}
liftA2 :: (a -> b -> c) -> [a] -> [b] -> [c]
liftA2 f :: a -> b -> c
f xs :: [a]
xs ys :: [b]
ys = [a -> b -> c
f a
x b
y | a
x <- [a]
xs, b
y <- [b]
ys]
{-# INLINE (*>) #-}
xs :: [a]
xs *> :: [a] -> [b] -> [b]
*> ys :: [b]
ys = [b
y | a
_ <- [a]
xs, b
y <- [b]
ys]
instance Monad [] where
{-# INLINE (>>=) #-}
xs :: [a]
xs >>= :: [a] -> (a -> [b]) -> [b]
>>= f :: a -> [b]
f = [b
y | a
x <- [a]
xs, b
y <- a -> [b]
f a
x]
{-# INLINE (>>) #-}
>> :: [a] -> [b] -> [b]
(>>) = [a] -> [b] -> [b]
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
(*>)
instance Alternative [] where
empty :: [a]
empty = []
<|> :: [a] -> [a] -> [a]
(<|>) = [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
(++)
instance MonadPlus []
foldr :: (a -> b -> b) -> b -> [a] -> b
{-# INLINE [0] foldr #-}
foldr :: (a -> b -> b) -> b -> [a] -> b
foldr k :: a -> b -> b
k z :: b
z = [a] -> b
go
where
go :: [a] -> b
go [] = b
z
go (y :: a
y:ys :: [a]
ys) = a
y a -> b -> b
`k` [a] -> b
go [a]
ys
build :: forall a. (forall b. (a -> b -> b) -> b -> b) -> [a]
{-# INLINE [1] build #-}
build :: (forall b. (a -> b -> b) -> b -> b) -> [a]
build g :: forall b. (a -> b -> b) -> b -> b
g = (a -> [a] -> [a]) -> [a] -> [a]
forall b. (a -> b -> b) -> b -> b
g (:) []
augment :: forall a. (forall b. (a->b->b) -> b -> b) -> [a] -> [a]
{-# INLINE [1] augment #-}
augment :: (forall b. (a -> b -> b) -> b -> b) -> [a] -> [a]
augment g :: forall b. (a -> b -> b) -> b -> b
g xs :: [a]
xs = (a -> [a] -> [a]) -> [a] -> [a]
forall b. (a -> b -> b) -> b -> b
g (:) [a]
xs
{-# RULES
"fold/build" forall k z (g::forall b. (a->b->b) -> b -> b) .
foldr k z (build g) = g k z
"foldr/augment" forall k z xs (g::forall b. (a->b->b) -> b -> b) .
foldr k z (augment g xs) = g k (foldr k z xs)
"foldr/id" foldr (:) [] = \x -> x
"foldr/app" [1] forall ys. foldr (:) ys = \xs -> xs ++ ys
-- Only activate this from phase 1, because that's
-- when we disable the rule that expands (++) into foldr
-- The foldr/cons rule looks nice, but it can give disastrously
-- bloated code when commpiling
-- array (a,b) [(1,2), (2,2), (3,2), ...very long list... ]
-- i.e. when there are very very long literal lists
-- So I've disabled it for now. We could have special cases
-- for short lists, I suppose.
-- "foldr/cons" forall k z x xs. foldr k z (x:xs) = k x (foldr k z xs)
"foldr/single" forall k z x. foldr k z [x] = k x z
"foldr/nil" forall k z. foldr k z [] = z
"foldr/cons/build" forall k z x (g::forall b. (a->b->b) -> b -> b) .
foldr k z (x:build g) = k x (g k z)
"augment/build" forall (g::forall b. (a->b->b) -> b -> b)
(h::forall b. (a->b->b) -> b -> b) .
augment g (build h) = build (\c n -> g c (h c n))
"augment/nil" forall (g::forall b. (a->b->b) -> b -> b) .
augment g [] = build g
#-}
map :: (a -> b) -> [a] -> [b]
{-# NOINLINE [0] map #-}
map :: (a -> b) -> [a] -> [b]
map _ [] = []
map f :: a -> b
f (x :: a
x:xs :: [a]
xs) = a -> b
f a
x b -> [b] -> [b]
forall a. a -> [a] -> [a]
: (a -> b) -> [a] -> [b]
forall a b. (a -> b) -> [a] -> [b]
map a -> b
f [a]
xs
mapFB :: (elt -> lst -> lst) -> (a -> elt) -> a -> lst -> lst
{-# INLINE [0] mapFB #-}
mapFB :: (elt -> lst -> lst) -> (a -> elt) -> a -> lst -> lst
mapFB c :: elt -> lst -> lst
c f :: a -> elt
f = \x :: a
x ys :: lst
ys -> elt -> lst -> lst
c (a -> elt
f a
x) lst
ys
{-# RULES
"map" [~1] forall f xs. map f xs = build (\c n -> foldr (mapFB c f) n xs)
"mapList" [1] forall f. foldr (mapFB (:) f) [] = map f
"mapFB" forall c f g. mapFB (mapFB c f) g = mapFB c (f.g)
"mapFB/id" forall c. mapFB c (\x -> x) = c
#-}
{-# RULES "map/coerce" [1] map coerce = coerce #-}
(++) :: [a] -> [a] -> [a]
{-# NOINLINE [1] (++) #-}
++ :: [a] -> [a] -> [a]
(++) [] ys :: [a]
ys = [a]
ys
(++) (x :: a
x:xs :: [a]
xs) ys :: [a]
ys = a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
xs [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ [a]
ys
{-# RULES
"++" [~1] forall xs ys. xs ++ ys = augment (\c n -> foldr c n xs) ys
#-}
otherwise :: Bool
otherwise :: Bool
otherwise = Bool
True
type String = [Char]
unsafeChr :: Int -> Char
unsafeChr :: Int -> Char
unsafeChr (I# i# :: Int#
i#) = Char# -> Char
C# (Int# -> Char#
chr# Int#
i#)
ord :: Char -> Int
ord :: Char -> Int
ord (C# c# :: Char#
c#) = Int# -> Int
I# (Char# -> Int#
ord# Char#
c#)
eqString :: String -> String -> Bool
eqString :: String -> String -> Bool
eqString [] [] = Bool
True
eqString (c1 :: Char
c1:cs1 :: String
cs1) (c2 :: Char
c2:cs2 :: String
cs2) = Char
c1 Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
c2 Bool -> Bool -> Bool
&& String
cs1 String -> String -> Bool
`eqString` String
cs2
eqString _ _ = Bool
False
{-# RULES "eqString" (==) = eqString #-}
maxInt, minInt :: Int
#if WORD_SIZE_IN_BITS == 31
minInt = I# (-0x40000000#)
maxInt = I# 0x3FFFFFFF#
#elif WORD_SIZE_IN_BITS == 32
minInt = I# (-0x80000000#)
maxInt = I# 0x7FFFFFFF#
#else
minInt :: Int
minInt = Int# -> Int
I# (-0x8000000000000000#)
maxInt :: Int
maxInt = Int# -> Int
I# 0x7FFFFFFFFFFFFFFF#
#endif
id :: a -> a
id :: a -> a
id x :: a
x = a
x
assert :: Bool -> a -> a
assert :: Bool -> a -> a
assert _pred :: Bool
_pred r :: a
r = a
r
breakpoint :: a -> a
breakpoint :: a -> a
breakpoint r :: a
r = a
r
breakpointCond :: Bool -> a -> a
breakpointCond :: Bool -> a -> a
breakpointCond _ r :: a
r = a
r
data Opaque = forall a. O a
const :: a -> b -> a
const :: a -> b -> a
const x :: a
x _ = a
x
{-# INLINE (.) #-}
(.) :: (b -> c) -> (a -> b) -> a -> c
. :: (b -> c) -> (a -> b) -> a -> c
(.) f :: b -> c
f g :: a -> b
g = \x :: a
x -> b -> c
f (a -> b
g a
x)
flip :: (a -> b -> c) -> b -> a -> c
flip :: (a -> b -> c) -> b -> a -> c
flip f :: a -> b -> c
f x :: b
x y :: a
y = a -> b -> c
f a
y b
x
{-# INLINE ($) #-}
($) :: forall r a (b :: TYPE r). (a -> b) -> a -> b
f :: a -> b
f $ :: (a -> b) -> a -> b
$ x :: a
x = a -> b
f a
x
($!) :: forall r a (b :: TYPE r). (a -> b) -> a -> b
f :: a -> b
f $! :: (a -> b) -> a -> b
$! x :: a
x = let !vx :: a
vx = a
x in a -> b
f a
vx
until :: (a -> Bool) -> (a -> a) -> a -> a
until :: (a -> Bool) -> (a -> a) -> a -> a
until p :: a -> Bool
p f :: a -> a
f = a -> a
go
where
go :: a -> a
go x :: a
x | a -> Bool
p a
x = a
x
| Bool
otherwise = a -> a
go (a -> a
f a
x)
asTypeOf :: a -> a -> a
asTypeOf :: a -> a -> a
asTypeOf = a -> a -> a
forall a b. a -> b -> a
const
instance Functor IO where
fmap :: (a -> b) -> IO a -> IO b
fmap f :: a -> b
f x :: IO a
x = IO a
x IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (b -> IO b
forall (f :: * -> *) a. Applicative f => a -> f a
pure (b -> IO b) -> (a -> b) -> a -> IO b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> b
f)
instance Applicative IO where
{-# INLINE pure #-}
{-# INLINE (*>) #-}
{-# INLINE liftA2 #-}
pure :: a -> IO a
pure = a -> IO a
forall a. a -> IO a
returnIO
*> :: IO a -> IO b -> IO b
(*>) = IO a -> IO b -> IO b
forall a b. IO a -> IO b -> IO b
thenIO
<*> :: IO (a -> b) -> IO a -> IO b
(<*>) = IO (a -> b) -> IO a -> IO b
forall (m :: * -> *) a b. Monad m => m (a -> b) -> m a -> m b
ap
liftA2 :: (a -> b -> c) -> IO a -> IO b -> IO c
liftA2 = (a -> b -> c) -> IO a -> IO b -> IO c
forall (m :: * -> *) a1 a2 r.
Monad m =>
(a1 -> a2 -> r) -> m a1 -> m a2 -> m r
liftM2
instance Monad IO where
{-# INLINE (>>) #-}
{-# INLINE (>>=) #-}
>> :: IO a -> IO b -> IO b
(>>) = IO a -> IO b -> IO b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
(*>)
>>= :: IO a -> (a -> IO b) -> IO b
(>>=) = IO a -> (a -> IO b) -> IO b
forall a b. IO a -> (a -> IO b) -> IO b
bindIO
instance Alternative IO where
empty :: IO a
empty = String -> IO a
forall a. String -> IO a
failIO "mzero"
<|> :: IO a -> IO a -> IO a
(<|>) = IO a -> IO a -> IO a
forall a. IO a -> IO a -> IO a
mplusIO
instance MonadPlus IO
returnIO :: a -> IO a
returnIO :: a -> IO a
returnIO x :: a
x = (State# RealWorld -> (# State# RealWorld, a #)) -> IO a
forall a. (State# RealWorld -> (# State# RealWorld, a #)) -> IO a
IO (\ s :: State# RealWorld
s -> (# State# RealWorld
s, a
x #))
bindIO :: IO a -> (a -> IO b) -> IO b
bindIO :: IO a -> (a -> IO b) -> IO b
bindIO (IO m :: State# RealWorld -> (# State# RealWorld, a #)
m) k :: a -> IO b
k = (State# RealWorld -> (# State# RealWorld, b #)) -> IO b
forall a. (State# RealWorld -> (# State# RealWorld, a #)) -> IO a
IO (\ s :: State# RealWorld
s -> case State# RealWorld -> (# State# RealWorld, a #)
m State# RealWorld
s of (# new_s :: State# RealWorld
new_s, a :: a
a #) -> IO b -> State# RealWorld -> (# State# RealWorld, b #)
forall a. IO a -> State# RealWorld -> (# State# RealWorld, a #)
unIO (a -> IO b
k a
a) State# RealWorld
new_s)
thenIO :: IO a -> IO b -> IO b
thenIO :: IO a -> IO b -> IO b
thenIO (IO m :: State# RealWorld -> (# State# RealWorld, a #)
m) k :: IO b
k = (State# RealWorld -> (# State# RealWorld, b #)) -> IO b
forall a. (State# RealWorld -> (# State# RealWorld, a #)) -> IO a
IO (\ s :: State# RealWorld
s -> case State# RealWorld -> (# State# RealWorld, a #)
m State# RealWorld
s of (# new_s :: State# RealWorld
new_s, _ #) -> IO b -> State# RealWorld -> (# State# RealWorld, b #)
forall a. IO a -> State# RealWorld -> (# State# RealWorld, a #)
unIO IO b
k State# RealWorld
new_s)
unIO :: IO a -> (State# RealWorld -> (# State# RealWorld, a #))
unIO :: IO a -> State# RealWorld -> (# State# RealWorld, a #)
unIO (IO a :: State# RealWorld -> (# State# RealWorld, a #)
a) = State# RealWorld -> (# State# RealWorld, a #)
a
{-# INLINE getTag #-}
getTag :: a -> Int#
getTag :: a -> Int#
getTag x :: a
x = a -> Int#
forall a. a -> Int#
dataToTag# a
x
{-# INLINE quotInt #-}
{-# INLINE remInt #-}
quotInt, remInt, divInt, modInt :: Int -> Int -> Int
(I# x :: Int#
x) quotInt :: Int -> Int -> Int
`quotInt` (I# y :: Int#
y) = Int# -> Int
I# (Int#
x Int# -> Int# -> Int#
`quotInt#` Int#
y)
(I# x :: Int#
x) remInt :: Int -> Int -> Int
`remInt` (I# y :: Int#
y) = Int# -> Int
I# (Int#
x Int# -> Int# -> Int#
`remInt#` Int#
y)
(I# x :: Int#
x) divInt :: Int -> Int -> Int
`divInt` (I# y :: Int#
y) = Int# -> Int
I# (Int#
x Int# -> Int# -> Int#
`divInt#` Int#
y)
(I# x :: Int#
x) modInt :: Int -> Int -> Int
`modInt` (I# y :: Int#
y) = Int# -> Int
I# (Int#
x Int# -> Int# -> Int#
`modInt#` Int#
y)
quotRemInt :: Int -> Int -> (Int, Int)
(I# x :: Int#
x) quotRemInt :: Int -> Int -> (Int, Int)
`quotRemInt` (I# y :: Int#
y) = case Int#
x Int# -> Int# -> (# Int#, Int# #)
`quotRemInt#` Int#
y of
(# q :: Int#
q, r :: Int#
r #) ->
(Int# -> Int
I# Int#
q, Int# -> Int
I# Int#
r)
divModInt :: Int -> Int -> (Int, Int)
(I# x :: Int#
x) divModInt :: Int -> Int -> (Int, Int)
`divModInt` (I# y :: Int#
y) = case Int#
x Int# -> Int# -> (# Int#, Int# #)
`divModInt#` Int#
y of
(# q :: Int#
q, r :: Int#
r #) -> (Int# -> Int
I# Int#
q, Int# -> Int
I# Int#
r)
divModInt# :: Int# -> Int# -> (# Int#, Int# #)
x# :: Int#
x# divModInt# :: Int# -> Int# -> (# Int#, Int# #)
`divModInt#` y# :: Int#
y#
| Int# -> Bool
isTrue# (Int#
x# Int# -> Int# -> Int#
># 0#) Bool -> Bool -> Bool
&& Int# -> Bool
isTrue# (Int#
y# Int# -> Int# -> Int#
<# 0#) =
case (Int#
x# Int# -> Int# -> Int#
-# 1#) Int# -> Int# -> (# Int#, Int# #)
`quotRemInt#` Int#
y# of
(# q :: Int#
q, r :: Int#
r #) -> (# Int#
q Int# -> Int# -> Int#
-# 1#, Int#
r Int# -> Int# -> Int#
+# Int#
y# Int# -> Int# -> Int#
+# 1# #)
| Int# -> Bool
isTrue# (Int#
x# Int# -> Int# -> Int#
<# 0#) Bool -> Bool -> Bool
&& Int# -> Bool
isTrue# (Int#
y# Int# -> Int# -> Int#
># 0#) =
case (Int#
x# Int# -> Int# -> Int#
+# 1#) Int# -> Int# -> (# Int#, Int# #)
`quotRemInt#` Int#
y# of
(# q :: Int#
q, r :: Int#
r #) -> (# Int#
q Int# -> Int# -> Int#
-# 1#, Int#
r Int# -> Int# -> Int#
+# Int#
y# Int# -> Int# -> Int#
-# 1# #)
| Bool
otherwise =
Int#
x# Int# -> Int# -> (# Int#, Int# #)
`quotRemInt#` Int#
y#
shiftL# :: Word# -> Int# -> Word#
a :: Word#
a shiftL# :: Word# -> Int# -> Word#
`shiftL#` b :: Int#
b | Int# -> Bool
isTrue# (Int#
b Int# -> Int# -> Int#
>=# WORD_SIZE_IN_BITS#) = 0##
| Bool
otherwise = Word#
a Word# -> Int# -> Word#
`uncheckedShiftL#` Int#
b
shiftRL# :: Word# -> Int# -> Word#
a :: Word#
a shiftRL# :: Word# -> Int# -> Word#
`shiftRL#` b :: Int#
b | Int# -> Bool
isTrue# (Int#
b Int# -> Int# -> Int#
>=# WORD_SIZE_IN_BITS#) = 0##
| Bool
otherwise = Word#
a Word# -> Int# -> Word#
`uncheckedShiftRL#` Int#
b
iShiftL# :: Int# -> Int# -> Int#
a :: Int#
a iShiftL# :: Int# -> Int# -> Int#
`iShiftL#` b :: Int#
b | Int# -> Bool
isTrue# (Int#
b Int# -> Int# -> Int#
>=# WORD_SIZE_IN_BITS#) = 0#
| Bool
otherwise = Int#
a Int# -> Int# -> Int#
`uncheckedIShiftL#` Int#
b
iShiftRA# :: Int# -> Int# -> Int#
a :: Int#
a iShiftRA# :: Int# -> Int# -> Int#
`iShiftRA#` b :: Int#
b | Int# -> Bool
isTrue# (Int#
b Int# -> Int# -> Int#
>=# WORD_SIZE_IN_BITS#) = if isTrue# (a <# 0#)
then (-1#)
else 0#
| Bool
otherwise = Int#
a Int# -> Int# -> Int#
`uncheckedIShiftRA#` Int#
b
iShiftRL# :: Int# -> Int# -> Int#
a :: Int#
a iShiftRL# :: Int# -> Int# -> Int#
`iShiftRL#` b :: Int#
b | Int# -> Bool
isTrue# (Int#
b Int# -> Int# -> Int#
>=# WORD_SIZE_IN_BITS#) = 0#
| Bool
otherwise = Int#
a Int# -> Int# -> Int#
`uncheckedIShiftRL#` Int#
b
{-# RULES
"unpack" [~1] forall a . unpackCString# a = build (unpackFoldrCString# a)
"unpack-list" [1] forall a . unpackFoldrCString# a (:) [] = unpackCString# a
"unpack-append" forall a n . unpackFoldrCString# a (:) n = unpackAppendCString# a n
-- There's a built-in rule (in PrelRules.hs) for
-- unpackFoldr "foo" c (unpackFoldr "baz" c n) = unpackFoldr "foobaz" c n
#-}