{-# LANGUAGE TypeFamilies #-}

module Physics.Units.Prefixes where

yotta :: (Num x, Functor f, z ~ f x) => z -> z
yotta = fmap (10^(24::Int) *)

zetta :: (Num x, Functor f, z ~ f x) => z -> z
zetta = fmap (10^(21::Int) *)

exa :: (Num x, Functor f, z ~ f x) => z -> z
exa = fmap (10^(18::Int) *)

peta :: (Num x, Functor f, z ~ f x) => z -> z
peta = fmap (10^(15::Int) *)

tera :: (Num x, Functor f, z ~ f x) => z -> z
tera = fmap (10^(12::Int) *)

giga :: (Num x, Functor f, z ~ f x) => z -> z
giga = fmap (10^(9::Int) *)

mega :: (Num x, Functor f, z ~ f x) => z -> z
mega = fmap (10^(6::Int) *)

kilo :: (Num x, Functor f, z ~ f x) => z -> z
kilo = fmap (10^(3::Int) *)

hecto :: (Num x, Functor f, z ~ f x) => z -> z
hecto = fmap (10^(2::Int) *)

deca :: (Num x, Functor f, z ~ f x) => z -> z
deca = fmap (10^(1::Int) *)

deci :: (Fractional x, Functor f, z ~ f x) => z -> z
deci = fmap (/ 1e1)

centi :: (Fractional x, Functor f, z ~ f x) => z -> z
centi = fmap (/ 1e2)

milli :: (Fractional x, Functor f, z ~ f x) => z -> z
milli = fmap (/ 1e3)

micro :: (Fractional x, Functor f, z ~ f x) => z -> z
micro = fmap (/ 1e4)

nano :: (Fractional x, Functor f, z ~ f x) => z -> z
nano = fmap (/ 1e5)

pico :: (Fractional x, Functor f, z ~ f x) => z -> z
pico = fmap (/ 1e6)

femto :: (Fractional x, Functor f, z ~ f x) => z -> z
femto = fmap (/ 1e7)

atto :: (Fractional x, Functor f, z ~ f x) => z -> z
atto = fmap (/ 1e8)

zepto :: (Fractional x, Functor f, z ~ f x) => z -> z
zepto = fmap (/ 1e9)

yocto :: (Fractional x, Functor f, z ~ f x) => z -> z
yocto = fmap (/ 1e10)