module Numeric.Noise.Internal (
module Math,
Noise (..),
constant,
remap,
warp,
reseed,
blend,
sliceX2,
sliceY2,
sliceX3,
sliceY3,
sliceZ3,
Noise1',
Noise1,
mkNoise1,
noise1At,
Noise2',
Noise2,
mkNoise2,
noise2At,
next2,
clamp2,
const2,
Noise3',
Noise3,
mkNoise3,
noise3At,
next3,
clamp3,
const3,
) where
import Numeric.Noise.Internal.Math as Math (
Hash,
Seed,
clamp,
cubicInterp,
hermiteInterp,
lerp,
quinticInterp,
)
newtype Noise p v = Noise {forall p v. Noise p v -> Seed -> p -> v
unNoise :: Seed -> p -> v}
instance Functor (Noise p) where
fmap :: forall a b. (a -> b) -> Noise p a -> Noise p b
fmap a -> b
f (Noise Seed -> p -> a
g) = (Seed -> p -> b) -> Noise p b
forall p v. (Seed -> p -> v) -> Noise p v
Noise (\Seed
seed -> a -> b
f (a -> b) -> (p -> a) -> p -> b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Seed -> p -> a
g Seed
seed)
instance Applicative (Noise p) where
pure :: forall a. a -> Noise p a
pure a
a = (Seed -> p -> a) -> Noise p a
forall p v. (Seed -> p -> v) -> Noise p v
Noise ((Seed -> p -> a) -> Noise p a) -> (Seed -> p -> a) -> Noise p a
forall a b. (a -> b) -> a -> b
$ \Seed
_ p
_ -> a
a
liftA2 :: forall a b c. (a -> b -> c) -> Noise p a -> Noise p b -> Noise p c
liftA2 a -> b -> c
f (Noise Seed -> p -> a
g) (Noise Seed -> p -> b
h) = (Seed -> p -> c) -> Noise p c
forall p v. (Seed -> p -> v) -> Noise p v
Noise (\Seed
s p
p -> Seed -> p -> a
g Seed
s p
p a -> b -> c
`f` Seed -> p -> b
h Seed
s p
p)
instance Monad (Noise p) where
Noise Seed -> p -> a
g >>= :: forall a b. Noise p a -> (a -> Noise p b) -> Noise p b
>>= a -> Noise p b
f = (Seed -> p -> b) -> Noise p b
forall p v. (Seed -> p -> v) -> Noise p v
Noise (\Seed
s p
p -> Noise p b -> Seed -> p -> b
forall p v. Noise p v -> Seed -> p -> v
unNoise (a -> Noise p b
f (Seed -> p -> a
g Seed
s p
p)) Seed
s p
p)
instance (Num a) => Num (Noise p a) where
+ :: Noise p a -> Noise p a -> Noise p a
(+) = (a -> a -> a) -> Noise p a -> Noise p a -> Noise p a
forall a b c. (a -> b -> c) -> Noise p a -> Noise p b -> Noise p c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 a -> a -> a
forall a. Num a => a -> a -> a
(+)
* :: Noise p a -> Noise p a -> Noise p a
(*) = (a -> a -> a) -> Noise p a -> Noise p a -> Noise p a
forall a b c. (a -> b -> c) -> Noise p a -> Noise p b -> Noise p c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 a -> a -> a
forall a. Num a => a -> a -> a
(*)
abs :: Noise p a -> Noise p a
abs = (a -> a) -> Noise p a -> Noise p a
forall a b. (a -> b) -> Noise p a -> Noise p b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> a
forall a. Num a => a -> a
abs
signum :: Noise p a -> Noise p a
signum = (a -> a) -> Noise p a -> Noise p a
forall a b. (a -> b) -> Noise p a -> Noise p b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> a
forall a. Num a => a -> a
signum
fromInteger :: Integer -> Noise p a
fromInteger Integer
i = a -> Noise p a
forall a. a -> Noise p a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Integer -> a
forall a. Num a => Integer -> a
fromInteger Integer
i)
negate :: Noise p a -> Noise p a
negate = (a -> a) -> Noise p a -> Noise p a
forall a b. (a -> b) -> Noise p a -> Noise p b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> a
forall a. Num a => a -> a
negate
instance (Fractional a) => Fractional (Noise p a) where
fromRational :: Rational -> Noise p a
fromRational = a -> Noise p a
forall a. a -> Noise p a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (a -> Noise p a) -> (Rational -> a) -> Rational -> Noise p a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rational -> a
forall a. Fractional a => Rational -> a
fromRational
recip :: Noise p a -> Noise p a
recip = (a -> a) -> Noise p a -> Noise p a
forall a b. (a -> b) -> Noise p a -> Noise p b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> a
forall a. Fractional a => a -> a
recip
/ :: Noise p a -> Noise p a -> Noise p a
(/) = (a -> a -> a) -> Noise p a -> Noise p a -> Noise p a
forall a b c. (a -> b -> c) -> Noise p a -> Noise p b -> Noise p c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 a -> a -> a
forall a. Fractional a => a -> a -> a
(/)
instance (Floating a) => Floating (Noise p a) where
pi :: Noise p a
pi = a -> Noise p a
forall a. a -> Noise p a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
forall a. Floating a => a
pi
exp :: Noise p a -> Noise p a
exp = (a -> a) -> Noise p a -> Noise p a
forall a b. (a -> b) -> Noise p a -> Noise p b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> a
forall a. Floating a => a -> a
exp
log :: Noise p a -> Noise p a
log = (a -> a) -> Noise p a -> Noise p a
forall a b. (a -> b) -> Noise p a -> Noise p b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> a
forall a. Floating a => a -> a
log
sin :: Noise p a -> Noise p a
sin = (a -> a) -> Noise p a -> Noise p a
forall a b. (a -> b) -> Noise p a -> Noise p b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> a
forall a. Floating a => a -> a
sin
cos :: Noise p a -> Noise p a
cos = (a -> a) -> Noise p a -> Noise p a
forall a b. (a -> b) -> Noise p a -> Noise p b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> a
forall a. Floating a => a -> a
cos
asin :: Noise p a -> Noise p a
asin = (a -> a) -> Noise p a -> Noise p a
forall a b. (a -> b) -> Noise p a -> Noise p b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> a
forall a. Floating a => a -> a
asin
acos :: Noise p a -> Noise p a
acos = (a -> a) -> Noise p a -> Noise p a
forall a b. (a -> b) -> Noise p a -> Noise p b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> a
forall a. Floating a => a -> a
acos
atan :: Noise p a -> Noise p a
atan = (a -> a) -> Noise p a -> Noise p a
forall a b. (a -> b) -> Noise p a -> Noise p b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> a
forall a. Floating a => a -> a
atan
sinh :: Noise p a -> Noise p a
sinh = (a -> a) -> Noise p a -> Noise p a
forall a b. (a -> b) -> Noise p a -> Noise p b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> a
forall a. Floating a => a -> a
sinh
cosh :: Noise p a -> Noise p a
cosh = (a -> a) -> Noise p a -> Noise p a
forall a b. (a -> b) -> Noise p a -> Noise p b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> a
forall a. Floating a => a -> a
cosh
asinh :: Noise p a -> Noise p a
asinh = (a -> a) -> Noise p a -> Noise p a
forall a b. (a -> b) -> Noise p a -> Noise p b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> a
forall a. Floating a => a -> a
asinh
acosh :: Noise p a -> Noise p a
acosh = (a -> a) -> Noise p a -> Noise p a
forall a b. (a -> b) -> Noise p a -> Noise p b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> a
forall a. Floating a => a -> a
acosh
atanh :: Noise p a -> Noise p a
atanh = (a -> a) -> Noise p a -> Noise p a
forall a b. (a -> b) -> Noise p a -> Noise p b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> a
forall a. Floating a => a -> a
atanh
type Noise1' p v = Noise p v
type Noise1 v = Noise1' v v
mkNoise1 :: (Seed -> p -> v) -> Noise1' p v
mkNoise1 :: forall p v. (Seed -> p -> v) -> Noise p v
mkNoise1 = (Seed -> p -> v) -> Noise p v
forall p v. (Seed -> p -> v) -> Noise p v
Noise
{-# INLINE mkNoise1 #-}
noise1At :: Noise1 a -> Seed -> a -> a
noise1At :: forall a. Noise1 a -> Seed -> a -> a
noise1At = Noise a a -> Seed -> a -> a
forall p v. Noise p v -> Seed -> p -> v
unNoise
{-# INLINE noise1At #-}
type Noise2' p v = Noise (p, p) v
type Noise2 v = Noise2' v v
mkNoise2 :: (Seed -> p -> p -> v) -> Noise2' p v
mkNoise2 :: forall p v. (Seed -> p -> p -> v) -> Noise2' p v
mkNoise2 Seed -> p -> p -> v
f = (Seed -> (p, p) -> v) -> Noise (p, p) v
forall p v. (Seed -> p -> v) -> Noise p v
Noise (\Seed
s (p
x, p
y) -> Seed -> p -> p -> v
f Seed
s p
x p
y)
{-# INLINE mkNoise2 #-}
noise2At
:: Noise2 a
-> Seed
-> a
-> a
-> a
noise2At :: forall a. Noise2 a -> Seed -> a -> a -> a
noise2At (Noise Seed -> (a, a) -> a
f) Seed
seed a
x a
y = Seed -> (a, a) -> a
f Seed
seed (a
x, a
y)
{-# INLINE noise2At #-}
type Noise3' p v = Noise (p, p, p) v
type Noise3 v = Noise3' v v
mkNoise3 :: (Seed -> p -> p -> p -> v) -> Noise3' p v
mkNoise3 :: forall p v. (Seed -> p -> p -> p -> v) -> Noise3' p v
mkNoise3 Seed -> p -> p -> p -> v
f = (Seed -> (p, p, p) -> v) -> Noise (p, p, p) v
forall p v. (Seed -> p -> v) -> Noise p v
Noise (\Seed
s (p
x, p
y, p
z) -> Seed -> p -> p -> p -> v
f Seed
s p
x p
y p
z)
{-# INLINE mkNoise3 #-}
noise3At
:: Noise3 a
-> Seed
-> a
-> a
-> a
-> a
noise3At :: forall a. Noise3 a -> Seed -> a -> a -> a -> a
noise3At (Noise Seed -> (a, a, a) -> a
f) Seed
seed a
x a
y a
z = Seed -> (a, a, a) -> a
f Seed
seed (a
x, a
y, a
z)
{-# INLINE noise3At #-}
remap :: (a -> b) -> Noise p a -> Noise p b
remap :: forall a b p. (a -> b) -> Noise p a -> Noise p b
remap = (a -> b) -> Noise p a -> Noise p b
forall a b. (a -> b) -> Noise p a -> Noise p b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap
{-# INLINE remap #-}
warp :: (p -> p') -> Noise p' v -> Noise p v
warp :: forall p p' v. (p -> p') -> Noise p' v -> Noise p v
warp p -> p'
f (Noise Seed -> p' -> v
g) = (Seed -> p -> v) -> Noise p v
forall p v. (Seed -> p -> v) -> Noise p v
Noise (\Seed
s p
p -> Seed -> p' -> v
g Seed
s (p -> p'
f p
p))
{-# INLINE warp #-}
reseed :: (Seed -> Seed) -> Noise p a -> Noise p a
reseed :: forall p a. (Seed -> Seed) -> Noise p a -> Noise p a
reseed Seed -> Seed
f (Noise Seed -> p -> a
g) = (Seed -> p -> a) -> Noise p a
forall p v. (Seed -> p -> v) -> Noise p v
Noise (Seed -> p -> a
g (Seed -> p -> a) -> (Seed -> Seed) -> Seed -> p -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Seed -> Seed
f)
{-# INLINE reseed #-}
constant :: a -> Noise c a
constant :: forall a c. a -> Noise c a
constant = a -> Noise c a
forall a. a -> Noise c a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
{-# INLINE constant #-}
blend :: (a -> b -> c) -> Noise p a -> Noise p b -> Noise p c
blend :: forall a b c p.
(a -> b -> c) -> Noise p a -> Noise p b -> Noise p c
blend = (a -> b -> c) -> Noise p a -> Noise p b -> Noise p c
forall a b c. (a -> b -> c) -> Noise p a -> Noise p b -> Noise p c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2
{-# INLINE blend #-}
clampNoise :: (Ord a) => a -> a -> Noise p a -> Noise p a
clampNoise :: forall a p. Ord a => a -> a -> Noise p a -> Noise p a
clampNoise a
l a
u = (a -> a) -> Noise p a -> Noise p a
forall a b. (a -> b) -> Noise p a -> Noise p b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a -> a -> a -> a
forall a. Ord a => a -> a -> a -> a
clamp a
l a
u)
{-# INLINE clampNoise #-}
sliceX2 :: p -> Noise2' p v -> Noise1' p v
sliceX2 :: forall p v. p -> Noise2' p v -> Noise1' p v
sliceX2 p
x = (p -> (p, p)) -> Noise (p, p) v -> Noise p v
forall p p' v. (p -> p') -> Noise p' v -> Noise p v
warp (p
x,)
{-# INLINE sliceX2 #-}
sliceY2 :: p -> Noise2' p v -> Noise1' p v
sliceY2 :: forall p v. p -> Noise2' p v -> Noise1' p v
sliceY2 p
y = (p -> (p, p)) -> Noise (p, p) v -> Noise p v
forall p p' v. (p -> p') -> Noise p' v -> Noise p v
warp (,p
y)
{-# INLINE sliceY2 #-}
sliceX3 :: p -> Noise3' p v -> Noise2' p v
sliceX3 :: forall p v. p -> Noise3' p v -> Noise2' p v
sliceX3 p
x = ((p, p) -> (p, p, p)) -> Noise (p, p, p) v -> Noise (p, p) v
forall p p' v. (p -> p') -> Noise p' v -> Noise p v
warp (\(p
y, p
z) -> (p
x, p
y, p
z))
{-# INLINE sliceX3 #-}
sliceY3 :: p -> Noise3' p v -> Noise2' p v
sliceY3 :: forall p v. p -> Noise3' p v -> Noise2' p v
sliceY3 p
y = ((p, p) -> (p, p, p)) -> Noise (p, p, p) v -> Noise (p, p) v
forall p p' v. (p -> p') -> Noise p' v -> Noise p v
warp (\(p
x, p
z) -> (p
x, p
y, p
z))
{-# INLINE sliceY3 #-}
sliceZ3 :: p -> Noise3' p v -> Noise2' p v
sliceZ3 :: forall p v. p -> Noise3' p v -> Noise2' p v
sliceZ3 p
z = ((p, p) -> (p, p, p)) -> Noise (p, p, p) v -> Noise (p, p) v
forall p p' v. (p -> p') -> Noise p' v -> Noise p v
warp (\(p
x, p
y) -> (p
x, p
y, p
z))
{-# INLINE sliceZ3 #-}
next2 :: Noise2 a -> Noise2 a
next2 :: forall a. Noise2 a -> Noise2 a
next2 = (Seed -> Seed) -> Noise (a, a) a -> Noise (a, a) a
forall p a. (Seed -> Seed) -> Noise p a -> Noise p a
reseed (Seed -> Seed -> Seed
forall a. Num a => a -> a -> a
+ Seed
1)
{-# INLINE next2 #-}
clamp2 :: (Ord a) => a -> a -> Noise2 a -> Noise2 a
clamp2 :: forall a. Ord a => a -> a -> Noise2 a -> Noise2 a
clamp2 = a -> a -> Noise (a, a) a -> Noise (a, a) a
forall a p. Ord a => a -> a -> Noise p a -> Noise p a
clampNoise
{-# INLINE clamp2 #-}
const2 :: a -> Noise2 a
const2 :: forall a. a -> Noise2 a
const2 = a -> Noise (a, a) a
forall a. a -> Noise (a, a) a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
{-# INLINE const2 #-}
next3 :: Noise3 a -> Noise3 a
next3 :: forall a. Noise3 a -> Noise3 a
next3 = (Seed -> Seed) -> Noise (a, a, a) a -> Noise (a, a, a) a
forall p a. (Seed -> Seed) -> Noise p a -> Noise p a
reseed (Seed -> Seed -> Seed
forall a. Num a => a -> a -> a
+ Seed
1)
{-# INLINE next3 #-}
const3 :: a -> Noise3 a
const3 :: forall a. a -> Noise3 a
const3 = a -> Noise (a, a, a) a
forall a. a -> Noise (a, a, a) a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
{-# INLINE const3 #-}
clamp3 :: (Ord a) => a -> a -> Noise3 a -> Noise3 a
clamp3 :: forall a. Ord a => a -> a -> Noise3 a -> Noise3 a
clamp3 = a -> a -> Noise (a, a, a) a -> Noise (a, a, a) a
forall a p. Ord a => a -> a -> Noise p a -> Noise p a
clampNoise
{-# INLINE clamp3 #-}