{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE LambdaCase #-}
module SwissEphemeris.Precalculated
(
EphemerisPosition (..),
Ephemeris (..),
EphemerisBlockNumber,
EpheVector,
EpheCalcOption (..),
PlanetListOption (..),
forPlanet,
planetEphe,
mkEphemerisBlockNumber,
extractEphemerisBlockNumber,
setEphe4Path,
readEphemeris,
readEphemerisStrict,
readEphemerisSimple,
readEphemerisEasy,
readEphemerisRaw,
readEphemerisRawNoFallback,
writeEphemeris,
foldEpheCalcOptions,
foldPlanetListOptions,
)
where
import Data.List (intersect)
import Data.List.NonEmpty (NonEmpty ((:|)), toList)
import qualified Data.Vector as V
import qualified Data.Vector.Unboxed as VU
import Foreign (Bits ((.|.)), nullPtr, peekArray)
import Foreign.C.String (peekCAString, withCString)
import Foreign.SweEphe4
( EpheCalcFlag (..),
EpheConst (unEpheConst),
PlacalcPlanet (unPlacalcPlanet),
PlanetListFlag (..),
c_dephread2,
c_ephe4_set_ephe_path,
c_ephe4_write_file,
eclipticIndex,
includeAll,
includeAllPlanets,
includeEcliptic,
includeNutation,
includeSpeed,
mustUseStoredEphe,
numberOfFactors,
nutationIndex,
pChiron,
pJupiter,
pLilith,
pMars,
pMeanNode,
pMercury,
pMoon,
pNeptune,
pPluto,
pSaturn,
pSun,
pTrueNode,
pUranus,
pVenus,
)
import GHC.Generics (Generic)
import SwissEphemeris.Internal
(
Planet
( Chiron,
Jupiter,
Mars,
MeanApog,
MeanNode,
Mercury,
Moon,
Neptune,
Pluto,
Saturn,
Sun,
TrueNode,
Uranus,
Venus
),
allocaErrorMessage, HasEclipticLongitude(..)
)
import SwissEphemeris.Time
data EphemerisPosition a = EphemerisPosition
{ EphemerisPosition a -> Planet
ephePlanet :: !Planet,
EphemerisPosition a -> a
epheLongitude :: !a,
EphemerisPosition a -> a
epheSpeed :: !a
}
deriving (EphemerisPosition a -> EphemerisPosition a -> Bool
(EphemerisPosition a -> EphemerisPosition a -> Bool)
-> (EphemerisPosition a -> EphemerisPosition a -> Bool)
-> Eq (EphemerisPosition a)
forall a.
Eq a =>
EphemerisPosition a -> EphemerisPosition a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: EphemerisPosition a -> EphemerisPosition a -> Bool
$c/= :: forall a.
Eq a =>
EphemerisPosition a -> EphemerisPosition a -> Bool
== :: EphemerisPosition a -> EphemerisPosition a -> Bool
$c== :: forall a.
Eq a =>
EphemerisPosition a -> EphemerisPosition a -> Bool
Eq, Int -> EphemerisPosition a -> ShowS
[EphemerisPosition a] -> ShowS
EphemerisPosition a -> String
(Int -> EphemerisPosition a -> ShowS)
-> (EphemerisPosition a -> String)
-> ([EphemerisPosition a] -> ShowS)
-> Show (EphemerisPosition a)
forall a. Show a => Int -> EphemerisPosition a -> ShowS
forall a. Show a => [EphemerisPosition a] -> ShowS
forall a. Show a => EphemerisPosition a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [EphemerisPosition a] -> ShowS
$cshowList :: forall a. Show a => [EphemerisPosition a] -> ShowS
show :: EphemerisPosition a -> String
$cshow :: forall a. Show a => EphemerisPosition a -> String
showsPrec :: Int -> EphemerisPosition a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> EphemerisPosition a -> ShowS
Show, (forall x. EphemerisPosition a -> Rep (EphemerisPosition a) x)
-> (forall x. Rep (EphemerisPosition a) x -> EphemerisPosition a)
-> Generic (EphemerisPosition a)
forall x. Rep (EphemerisPosition a) x -> EphemerisPosition a
forall x. EphemerisPosition a -> Rep (EphemerisPosition a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (EphemerisPosition a) x -> EphemerisPosition a
forall a x. EphemerisPosition a -> Rep (EphemerisPosition a) x
$cto :: forall a x. Rep (EphemerisPosition a) x -> EphemerisPosition a
$cfrom :: forall a x. EphemerisPosition a -> Rep (EphemerisPosition a) x
Generic)
instance (Real a, Eq a, Fractional a) => HasEclipticLongitude (EphemerisPosition a) where
getEclipticLongitude :: EphemerisPosition a -> Double
getEclipticLongitude = a -> Double
forall a b. (Real a, Fractional b) => a -> b
realToFrac (a -> Double)
-> (EphemerisPosition a -> a) -> EphemerisPosition a -> Double
forall b c a. (b -> c) -> (a -> b) -> a -> c
. EphemerisPosition a -> a
forall a. EphemerisPosition a -> a
epheLongitude
setEclipticLongitude :: EphemerisPosition a -> Double -> EphemerisPosition a
setEclipticLongitude EphemerisPosition a
p Double
l' = EphemerisPosition a
p{epheLongitude :: a
epheLongitude = Double -> a
forall a b. (Real a, Fractional b) => a -> b
realToFrac Double
l'}
data Ephemeris a = Ephemeris
{ Ephemeris a -> JulianDayTT
epheDate :: !JulianDayTT,
Ephemeris a -> a
epheEcliptic :: !a,
Ephemeris a -> a
epheNutation :: !a,
Ephemeris a -> Vector (EphemerisPosition a)
ephePositions :: !(V.Vector (EphemerisPosition a))
}
deriving (Ephemeris a -> Ephemeris a -> Bool
(Ephemeris a -> Ephemeris a -> Bool)
-> (Ephemeris a -> Ephemeris a -> Bool) -> Eq (Ephemeris a)
forall a. Eq a => Ephemeris a -> Ephemeris a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Ephemeris a -> Ephemeris a -> Bool
$c/= :: forall a. Eq a => Ephemeris a -> Ephemeris a -> Bool
== :: Ephemeris a -> Ephemeris a -> Bool
$c== :: forall a. Eq a => Ephemeris a -> Ephemeris a -> Bool
Eq, Int -> Ephemeris a -> ShowS
[Ephemeris a] -> ShowS
Ephemeris a -> String
(Int -> Ephemeris a -> ShowS)
-> (Ephemeris a -> String)
-> ([Ephemeris a] -> ShowS)
-> Show (Ephemeris a)
forall a. Show a => Int -> Ephemeris a -> ShowS
forall a. Show a => [Ephemeris a] -> ShowS
forall a. Show a => Ephemeris a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Ephemeris a] -> ShowS
$cshowList :: forall a. Show a => [Ephemeris a] -> ShowS
show :: Ephemeris a -> String
$cshow :: forall a. Show a => Ephemeris a -> String
showsPrec :: Int -> Ephemeris a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> Ephemeris a -> ShowS
Show, (forall x. Ephemeris a -> Rep (Ephemeris a) x)
-> (forall x. Rep (Ephemeris a) x -> Ephemeris a)
-> Generic (Ephemeris a)
forall x. Rep (Ephemeris a) x -> Ephemeris a
forall x. Ephemeris a -> Rep (Ephemeris a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (Ephemeris a) x -> Ephemeris a
forall a x. Ephemeris a -> Rep (Ephemeris a) x
$cto :: forall a x. Rep (Ephemeris a) x -> Ephemeris a
$cfrom :: forall a x. Ephemeris a -> Rep (Ephemeris a) x
Generic)
data EpheCalcOption
= IncludeSpeed
| MustUseStoredEphe
deriving (EpheCalcOption -> EpheCalcOption -> Bool
(EpheCalcOption -> EpheCalcOption -> Bool)
-> (EpheCalcOption -> EpheCalcOption -> Bool) -> Eq EpheCalcOption
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: EpheCalcOption -> EpheCalcOption -> Bool
$c/= :: EpheCalcOption -> EpheCalcOption -> Bool
== :: EpheCalcOption -> EpheCalcOption -> Bool
$c== :: EpheCalcOption -> EpheCalcOption -> Bool
Eq, Int -> EpheCalcOption -> ShowS
[EpheCalcOption] -> ShowS
EpheCalcOption -> String
(Int -> EpheCalcOption -> ShowS)
-> (EpheCalcOption -> String)
-> ([EpheCalcOption] -> ShowS)
-> Show EpheCalcOption
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [EpheCalcOption] -> ShowS
$cshowList :: [EpheCalcOption] -> ShowS
show :: EpheCalcOption -> String
$cshow :: EpheCalcOption -> String
showsPrec :: Int -> EpheCalcOption -> ShowS
$cshowsPrec :: Int -> EpheCalcOption -> ShowS
Show, Int -> EpheCalcOption
EpheCalcOption -> Int
EpheCalcOption -> [EpheCalcOption]
EpheCalcOption -> EpheCalcOption
EpheCalcOption -> EpheCalcOption -> [EpheCalcOption]
EpheCalcOption
-> EpheCalcOption -> EpheCalcOption -> [EpheCalcOption]
(EpheCalcOption -> EpheCalcOption)
-> (EpheCalcOption -> EpheCalcOption)
-> (Int -> EpheCalcOption)
-> (EpheCalcOption -> Int)
-> (EpheCalcOption -> [EpheCalcOption])
-> (EpheCalcOption -> EpheCalcOption -> [EpheCalcOption])
-> (EpheCalcOption -> EpheCalcOption -> [EpheCalcOption])
-> (EpheCalcOption
-> EpheCalcOption -> EpheCalcOption -> [EpheCalcOption])
-> Enum EpheCalcOption
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: EpheCalcOption
-> EpheCalcOption -> EpheCalcOption -> [EpheCalcOption]
$cenumFromThenTo :: EpheCalcOption
-> EpheCalcOption -> EpheCalcOption -> [EpheCalcOption]
enumFromTo :: EpheCalcOption -> EpheCalcOption -> [EpheCalcOption]
$cenumFromTo :: EpheCalcOption -> EpheCalcOption -> [EpheCalcOption]
enumFromThen :: EpheCalcOption -> EpheCalcOption -> [EpheCalcOption]
$cenumFromThen :: EpheCalcOption -> EpheCalcOption -> [EpheCalcOption]
enumFrom :: EpheCalcOption -> [EpheCalcOption]
$cenumFrom :: EpheCalcOption -> [EpheCalcOption]
fromEnum :: EpheCalcOption -> Int
$cfromEnum :: EpheCalcOption -> Int
toEnum :: Int -> EpheCalcOption
$ctoEnum :: Int -> EpheCalcOption
pred :: EpheCalcOption -> EpheCalcOption
$cpred :: EpheCalcOption -> EpheCalcOption
succ :: EpheCalcOption -> EpheCalcOption
$csucc :: EpheCalcOption -> EpheCalcOption
Enum, (forall x. EpheCalcOption -> Rep EpheCalcOption x)
-> (forall x. Rep EpheCalcOption x -> EpheCalcOption)
-> Generic EpheCalcOption
forall x. Rep EpheCalcOption x -> EpheCalcOption
forall x. EpheCalcOption -> Rep EpheCalcOption x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep EpheCalcOption x -> EpheCalcOption
$cfrom :: forall x. EpheCalcOption -> Rep EpheCalcOption x
Generic)
data PlanetListOption
= IncludeAllPlanets
| IncludeEcliptic
| IncludeNutation
| IncludeAll
deriving (PlanetListOption -> PlanetListOption -> Bool
(PlanetListOption -> PlanetListOption -> Bool)
-> (PlanetListOption -> PlanetListOption -> Bool)
-> Eq PlanetListOption
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PlanetListOption -> PlanetListOption -> Bool
$c/= :: PlanetListOption -> PlanetListOption -> Bool
== :: PlanetListOption -> PlanetListOption -> Bool
$c== :: PlanetListOption -> PlanetListOption -> Bool
Eq, Int -> PlanetListOption -> ShowS
[PlanetListOption] -> ShowS
PlanetListOption -> String
(Int -> PlanetListOption -> ShowS)
-> (PlanetListOption -> String)
-> ([PlanetListOption] -> ShowS)
-> Show PlanetListOption
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PlanetListOption] -> ShowS
$cshowList :: [PlanetListOption] -> ShowS
show :: PlanetListOption -> String
$cshow :: PlanetListOption -> String
showsPrec :: Int -> PlanetListOption -> ShowS
$cshowsPrec :: Int -> PlanetListOption -> ShowS
Show, Int -> PlanetListOption
PlanetListOption -> Int
PlanetListOption -> [PlanetListOption]
PlanetListOption -> PlanetListOption
PlanetListOption -> PlanetListOption -> [PlanetListOption]
PlanetListOption
-> PlanetListOption -> PlanetListOption -> [PlanetListOption]
(PlanetListOption -> PlanetListOption)
-> (PlanetListOption -> PlanetListOption)
-> (Int -> PlanetListOption)
-> (PlanetListOption -> Int)
-> (PlanetListOption -> [PlanetListOption])
-> (PlanetListOption -> PlanetListOption -> [PlanetListOption])
-> (PlanetListOption -> PlanetListOption -> [PlanetListOption])
-> (PlanetListOption
-> PlanetListOption -> PlanetListOption -> [PlanetListOption])
-> Enum PlanetListOption
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: PlanetListOption
-> PlanetListOption -> PlanetListOption -> [PlanetListOption]
$cenumFromThenTo :: PlanetListOption
-> PlanetListOption -> PlanetListOption -> [PlanetListOption]
enumFromTo :: PlanetListOption -> PlanetListOption -> [PlanetListOption]
$cenumFromTo :: PlanetListOption -> PlanetListOption -> [PlanetListOption]
enumFromThen :: PlanetListOption -> PlanetListOption -> [PlanetListOption]
$cenumFromThen :: PlanetListOption -> PlanetListOption -> [PlanetListOption]
enumFrom :: PlanetListOption -> [PlanetListOption]
$cenumFrom :: PlanetListOption -> [PlanetListOption]
fromEnum :: PlanetListOption -> Int
$cfromEnum :: PlanetListOption -> Int
toEnum :: Int -> PlanetListOption
$ctoEnum :: Int -> PlanetListOption
pred :: PlanetListOption -> PlanetListOption
$cpred :: PlanetListOption -> PlanetListOption
succ :: PlanetListOption -> PlanetListOption
$csucc :: PlanetListOption -> PlanetListOption
Enum, (forall x. PlanetListOption -> Rep PlanetListOption x)
-> (forall x. Rep PlanetListOption x -> PlanetListOption)
-> Generic PlanetListOption
forall x. Rep PlanetListOption x -> PlanetListOption
forall x. PlanetListOption -> Rep PlanetListOption x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep PlanetListOption x -> PlanetListOption
$cfrom :: forall x. PlanetListOption -> Rep PlanetListOption x
Generic)
newtype EphemerisBlockNumber
= EphemerisBlockNumber Int
deriving (EphemerisBlockNumber -> EphemerisBlockNumber -> Bool
(EphemerisBlockNumber -> EphemerisBlockNumber -> Bool)
-> (EphemerisBlockNumber -> EphemerisBlockNumber -> Bool)
-> Eq EphemerisBlockNumber
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: EphemerisBlockNumber -> EphemerisBlockNumber -> Bool
$c/= :: EphemerisBlockNumber -> EphemerisBlockNumber -> Bool
== :: EphemerisBlockNumber -> EphemerisBlockNumber -> Bool
$c== :: EphemerisBlockNumber -> EphemerisBlockNumber -> Bool
Eq, Int -> EphemerisBlockNumber -> ShowS
[EphemerisBlockNumber] -> ShowS
EphemerisBlockNumber -> String
(Int -> EphemerisBlockNumber -> ShowS)
-> (EphemerisBlockNumber -> String)
-> ([EphemerisBlockNumber] -> ShowS)
-> Show EphemerisBlockNumber
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [EphemerisBlockNumber] -> ShowS
$cshowList :: [EphemerisBlockNumber] -> ShowS
show :: EphemerisBlockNumber -> String
$cshow :: EphemerisBlockNumber -> String
showsPrec :: Int -> EphemerisBlockNumber -> ShowS
$cshowsPrec :: Int -> EphemerisBlockNumber -> ShowS
Show, Eq EphemerisBlockNumber
Eq EphemerisBlockNumber
-> (EphemerisBlockNumber -> EphemerisBlockNumber -> Ordering)
-> (EphemerisBlockNumber -> EphemerisBlockNumber -> Bool)
-> (EphemerisBlockNumber -> EphemerisBlockNumber -> Bool)
-> (EphemerisBlockNumber -> EphemerisBlockNumber -> Bool)
-> (EphemerisBlockNumber -> EphemerisBlockNumber -> Bool)
-> (EphemerisBlockNumber
-> EphemerisBlockNumber -> EphemerisBlockNumber)
-> (EphemerisBlockNumber
-> EphemerisBlockNumber -> EphemerisBlockNumber)
-> Ord EphemerisBlockNumber
EphemerisBlockNumber -> EphemerisBlockNumber -> Bool
EphemerisBlockNumber -> EphemerisBlockNumber -> Ordering
EphemerisBlockNumber
-> EphemerisBlockNumber -> EphemerisBlockNumber
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: EphemerisBlockNumber
-> EphemerisBlockNumber -> EphemerisBlockNumber
$cmin :: EphemerisBlockNumber
-> EphemerisBlockNumber -> EphemerisBlockNumber
max :: EphemerisBlockNumber
-> EphemerisBlockNumber -> EphemerisBlockNumber
$cmax :: EphemerisBlockNumber
-> EphemerisBlockNumber -> EphemerisBlockNumber
>= :: EphemerisBlockNumber -> EphemerisBlockNumber -> Bool
$c>= :: EphemerisBlockNumber -> EphemerisBlockNumber -> Bool
> :: EphemerisBlockNumber -> EphemerisBlockNumber -> Bool
$c> :: EphemerisBlockNumber -> EphemerisBlockNumber -> Bool
<= :: EphemerisBlockNumber -> EphemerisBlockNumber -> Bool
$c<= :: EphemerisBlockNumber -> EphemerisBlockNumber -> Bool
< :: EphemerisBlockNumber -> EphemerisBlockNumber -> Bool
$c< :: EphemerisBlockNumber -> EphemerisBlockNumber -> Bool
compare :: EphemerisBlockNumber -> EphemerisBlockNumber -> Ordering
$ccompare :: EphemerisBlockNumber -> EphemerisBlockNumber -> Ordering
$cp1Ord :: Eq EphemerisBlockNumber
Ord)
instance Bounded EphemerisBlockNumber where
minBound :: EphemerisBlockNumber
minBound = Int -> EphemerisBlockNumber
EphemerisBlockNumber (Int -> EphemerisBlockNumber) -> Int -> EphemerisBlockNumber
forall a b. (a -> b) -> a -> b
$ -Int
20
maxBound :: EphemerisBlockNumber
maxBound = Int -> EphemerisBlockNumber
EphemerisBlockNumber Int
300
instance Enum EphemerisBlockNumber where
succ :: EphemerisBlockNumber -> EphemerisBlockNumber
succ en :: EphemerisBlockNumber
en@(EphemerisBlockNumber Int
n) =
if EphemerisBlockNumber
en EphemerisBlockNumber -> EphemerisBlockNumber -> Bool
forall a. Eq a => a -> a -> Bool
== EphemerisBlockNumber
forall a. Bounded a => a
maxBound then
String -> EphemerisBlockNumber
forall a. HasCallStack => String -> a
error String
"max bound reached"
else
Int -> EphemerisBlockNumber
EphemerisBlockNumber (Int -> Int
forall a. Enum a => a -> a
succ Int
n)
pred :: EphemerisBlockNumber -> EphemerisBlockNumber
pred en :: EphemerisBlockNumber
en@(EphemerisBlockNumber Int
n) =
if EphemerisBlockNumber
en EphemerisBlockNumber -> EphemerisBlockNumber -> Bool
forall a. Eq a => a -> a -> Bool
== EphemerisBlockNumber
forall a. Bounded a => a
minBound then
String -> EphemerisBlockNumber
forall a. HasCallStack => String -> a
error String
"min bound reached"
else
Int -> EphemerisBlockNumber
EphemerisBlockNumber (Int -> Int
forall a. Enum a => a -> a
pred Int
n)
toEnum :: Int -> EphemerisBlockNumber
toEnum = Int -> EphemerisBlockNumber
EphemerisBlockNumber
fromEnum :: EphemerisBlockNumber -> Int
fromEnum (EphemerisBlockNumber Int
n) = Int
n
enumFrom :: EphemerisBlockNumber -> [EphemerisBlockNumber]
enumFrom EphemerisBlockNumber
x = EphemerisBlockNumber
-> EphemerisBlockNumber -> [EphemerisBlockNumber]
forall a. Enum a => a -> a -> [a]
enumFromTo EphemerisBlockNumber
x EphemerisBlockNumber
forall a. Bounded a => a
maxBound
enumFromThen :: EphemerisBlockNumber
-> EphemerisBlockNumber -> [EphemerisBlockNumber]
enumFromThen EphemerisBlockNumber
x EphemerisBlockNumber
y = EphemerisBlockNumber
-> EphemerisBlockNumber
-> EphemerisBlockNumber
-> [EphemerisBlockNumber]
forall a. Enum a => a -> a -> a -> [a]
enumFromThenTo EphemerisBlockNumber
x EphemerisBlockNumber
y EphemerisBlockNumber
forall a. Bounded a => a
maxBound
enumFromTo :: EphemerisBlockNumber
-> EphemerisBlockNumber -> [EphemerisBlockNumber]
enumFromTo (EphemerisBlockNumber Int
n) (EphemerisBlockNumber Int
m) =
(Int -> EphemerisBlockNumber) -> [Int] -> [EphemerisBlockNumber]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Int -> EphemerisBlockNumber
EphemerisBlockNumber (Int -> Int -> [Int]
forall a. Enum a => a -> a -> [a]
enumFromTo Int
n Int
m)
enumFromThenTo :: EphemerisBlockNumber
-> EphemerisBlockNumber
-> EphemerisBlockNumber
-> [EphemerisBlockNumber]
enumFromThenTo (EphemerisBlockNumber Int
n) (EphemerisBlockNumber Int
n') (EphemerisBlockNumber Int
m) =
(Int -> EphemerisBlockNumber) -> [Int] -> [EphemerisBlockNumber]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Int -> EphemerisBlockNumber
EphemerisBlockNumber (Int -> Int -> Int -> [Int]
forall a. Enum a => a -> a -> a -> [a]
enumFromThenTo Int
n Int
n' Int
m)
mkEphemerisBlockNumber :: Int -> Maybe EphemerisBlockNumber
mkEphemerisBlockNumber :: Int -> Maybe EphemerisBlockNumber
mkEphemerisBlockNumber Int
n
| Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> EphemerisBlockNumber -> Int
extractEphemerisBlockNumber EphemerisBlockNumber
forall a. Bounded a => a
minBound Bool -> Bool -> Bool
&& Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< EphemerisBlockNumber -> Int
extractEphemerisBlockNumber EphemerisBlockNumber
forall a. Bounded a => a
maxBound = EphemerisBlockNumber -> Maybe EphemerisBlockNumber
forall a. a -> Maybe a
Just (EphemerisBlockNumber -> Maybe EphemerisBlockNumber)
-> (Int -> EphemerisBlockNumber)
-> Int
-> Maybe EphemerisBlockNumber
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> EphemerisBlockNumber
EphemerisBlockNumber (Int -> Maybe EphemerisBlockNumber)
-> Int -> Maybe EphemerisBlockNumber
forall a b. (a -> b) -> a -> b
$ Int
n
| Bool
otherwise = Maybe EphemerisBlockNumber
forall a. Maybe a
Nothing
extractEphemerisBlockNumber :: EphemerisBlockNumber -> Int
(EphemerisBlockNumber Int
n) = Int
n
type EpheVector = VU.Vector Double
forPlanet :: Ephemeris a -> Planet -> Maybe (EphemerisPosition a)
forPlanet :: Ephemeris a -> Planet -> Maybe (EphemerisPosition a)
forPlanet Ephemeris a
ephe Planet
pl =
case Planet -> Maybe PlacalcPlanet
planetToPlanetOption Planet
pl of
Maybe PlacalcPlanet
Nothing -> Maybe (EphemerisPosition a)
forall a. Maybe a
Nothing
Just PlacalcPlanet
placalc -> Ephemeris a -> Vector (EphemerisPosition a)
forall a. Ephemeris a -> Vector (EphemerisPosition a)
ephePositions Ephemeris a
ephe Vector (EphemerisPosition a) -> Int -> Maybe (EphemerisPosition a)
forall a. Vector a -> Int -> Maybe a
V.!? (CInt -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (CInt -> Int) -> (PlacalcPlanet -> CInt) -> PlacalcPlanet -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PlacalcPlanet -> CInt
unPlacalcPlanet (PlacalcPlanet -> Int) -> PlacalcPlanet -> Int
forall a b. (a -> b) -> a -> b
$ PlacalcPlanet
placalc)
planetEphe :: Planet -> Ephemeris a -> Maybe (EphemerisPosition a)
planetEphe :: Planet -> Ephemeris a -> Maybe (EphemerisPosition a)
planetEphe = (Ephemeris a -> Planet -> Maybe (EphemerisPosition a))
-> Planet -> Ephemeris a -> Maybe (EphemerisPosition a)
forall a b c. (a -> b -> c) -> b -> a -> c
flip Ephemeris a -> Planet -> Maybe (EphemerisPosition a)
forall a. Ephemeris a -> Planet -> Maybe (EphemerisPosition a)
forPlanet
setEphe4Path :: FilePath -> IO ()
setEphe4Path :: String -> IO ()
setEphe4Path String
path =
String -> (CString -> IO ()) -> IO ()
forall a. String -> (CString -> IO a) -> IO a
withCString String
path ((CString -> IO ()) -> IO ()) -> (CString -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \CString
baseEphe4Path -> CString -> IO ()
c_ephe4_set_ephe_path CString
baseEphe4Path
readEphemeris ::
( NonEmpty PlanetListOption ->
NonEmpty EpheCalcOption ->
JulianDayTT ->
EpheVector ->
a
) ->
NonEmpty PlanetListOption ->
NonEmpty EpheCalcOption ->
JulianDayTT ->
IO (Either String a)
readEphemeris :: (NonEmpty PlanetListOption
-> NonEmpty EpheCalcOption -> JulianDayTT -> EpheVector -> a)
-> NonEmpty PlanetListOption
-> NonEmpty EpheCalcOption
-> JulianDayTT
-> IO (Either String a)
readEphemeris NonEmpty PlanetListOption
-> NonEmpty EpheCalcOption -> JulianDayTT -> EpheVector -> a
mkEphemeris NonEmpty PlanetListOption
planetOptions NonEmpty EpheCalcOption
calcOptions JulianDayTT
time = do
let plalist :: PlanetListFlag
plalist =
[PlanetListFlag] -> PlanetListFlag
foldPlanetListOptions
([PlanetListFlag] -> PlanetListFlag)
-> (NonEmpty PlanetListOption -> [PlanetListFlag])
-> NonEmpty PlanetListOption
-> PlanetListFlag
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (PlanetListOption -> PlanetListFlag)
-> [PlanetListOption] -> [PlanetListFlag]
forall a b. (a -> b) -> [a] -> [b]
map PlanetListOption -> PlanetListFlag
planetListOptionToFlag
([PlanetListOption] -> [PlanetListFlag])
-> (NonEmpty PlanetListOption -> [PlanetListOption])
-> NonEmpty PlanetListOption
-> [PlanetListFlag]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NonEmpty PlanetListOption -> [PlanetListOption]
forall a. NonEmpty a -> [a]
toList
(NonEmpty PlanetListOption -> PlanetListFlag)
-> NonEmpty PlanetListOption -> PlanetListFlag
forall a b. (a -> b) -> a -> b
$ NonEmpty PlanetListOption
planetOptions
flag :: EpheCalcFlag
flag =
[EpheCalcFlag] -> EpheCalcFlag
foldEpheCalcOptions
([EpheCalcFlag] -> EpheCalcFlag)
-> (NonEmpty EpheCalcOption -> [EpheCalcFlag])
-> NonEmpty EpheCalcOption
-> EpheCalcFlag
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (EpheCalcOption -> EpheCalcFlag)
-> [EpheCalcOption] -> [EpheCalcFlag]
forall a b. (a -> b) -> [a] -> [b]
map EpheCalcOption -> EpheCalcFlag
epheOptionToFlag
([EpheCalcOption] -> [EpheCalcFlag])
-> (NonEmpty EpheCalcOption -> [EpheCalcOption])
-> NonEmpty EpheCalcOption
-> [EpheCalcFlag]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NonEmpty EpheCalcOption -> [EpheCalcOption]
forall a. NonEmpty a -> [a]
toList
(NonEmpty EpheCalcOption -> EpheCalcFlag)
-> NonEmpty EpheCalcOption -> EpheCalcFlag
forall a b. (a -> b) -> a -> b
$ NonEmpty EpheCalcOption
calcOptions
Either String EpheVector
ephe <- PlanetListFlag
-> EpheCalcFlag -> JulianDayTT -> IO (Either String EpheVector)
readEphemerisRaw PlanetListFlag
plalist EpheCalcFlag
flag JulianDayTT
time
Either String a -> IO (Either String a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Either String a -> IO (Either String a))
-> Either String a -> IO (Either String a)
forall a b. (a -> b) -> a -> b
$ NonEmpty PlanetListOption
-> NonEmpty EpheCalcOption -> JulianDayTT -> EpheVector -> a
mkEphemeris NonEmpty PlanetListOption
planetOptions NonEmpty EpheCalcOption
calcOptions JulianDayTT
time (EpheVector -> a) -> Either String EpheVector -> Either String a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Either String EpheVector
ephe
readEphemerisStrict ::
NonEmpty PlanetListOption ->
NonEmpty EpheCalcOption ->
JulianDayTT ->
IO (Either String (Ephemeris (Maybe Double)))
readEphemerisStrict :: NonEmpty PlanetListOption
-> NonEmpty EpheCalcOption
-> JulianDayTT
-> IO (Either String (Ephemeris (Maybe Double)))
readEphemerisStrict = (NonEmpty PlanetListOption
-> NonEmpty EpheCalcOption
-> JulianDayTT
-> EpheVector
-> Ephemeris (Maybe Double))
-> NonEmpty PlanetListOption
-> NonEmpty EpheCalcOption
-> JulianDayTT
-> IO (Either String (Ephemeris (Maybe Double)))
forall a.
(NonEmpty PlanetListOption
-> NonEmpty EpheCalcOption -> JulianDayTT -> EpheVector -> a)
-> NonEmpty PlanetListOption
-> NonEmpty EpheCalcOption
-> JulianDayTT
-> IO (Either String a)
readEphemeris NonEmpty PlanetListOption
-> NonEmpty EpheCalcOption
-> JulianDayTT
-> EpheVector
-> Ephemeris (Maybe Double)
mkEphemerisStrict
readEphemerisSimple ::
NonEmpty PlanetListOption ->
NonEmpty EpheCalcOption ->
JulianDayTT ->
IO (Either String (Ephemeris Double))
readEphemerisSimple :: NonEmpty PlanetListOption
-> NonEmpty EpheCalcOption
-> JulianDayTT
-> IO (Either String (Ephemeris Double))
readEphemerisSimple = (NonEmpty PlanetListOption
-> NonEmpty EpheCalcOption
-> JulianDayTT
-> EpheVector
-> Ephemeris Double)
-> NonEmpty PlanetListOption
-> NonEmpty EpheCalcOption
-> JulianDayTT
-> IO (Either String (Ephemeris Double))
forall a.
(NonEmpty PlanetListOption
-> NonEmpty EpheCalcOption -> JulianDayTT -> EpheVector -> a)
-> NonEmpty PlanetListOption
-> NonEmpty EpheCalcOption
-> JulianDayTT
-> IO (Either String a)
readEphemeris NonEmpty PlanetListOption
-> NonEmpty EpheCalcOption
-> JulianDayTT
-> EpheVector
-> Ephemeris Double
mkEphemerisSimple
readEphemerisEasy :: Bool -> JulianDayTT -> IO (Either String (Ephemeris Double))
readEphemerisEasy :: Bool -> JulianDayTT -> IO (Either String (Ephemeris Double))
readEphemerisEasy Bool
allowFallback =
NonEmpty PlanetListOption
-> NonEmpty EpheCalcOption
-> JulianDayTT
-> IO (Either String (Ephemeris Double))
readEphemerisSimple
(PlanetListOption
IncludeAll PlanetListOption -> [PlanetListOption] -> NonEmpty PlanetListOption
forall a. a -> [a] -> NonEmpty a
:| [])
(if Bool
allowFallback then NonEmpty EpheCalcOption
withFallback else NonEmpty EpheCalcOption
noFallback)
where
withFallback :: NonEmpty EpheCalcOption
withFallback = EpheCalcOption
IncludeSpeed EpheCalcOption -> [EpheCalcOption] -> NonEmpty EpheCalcOption
forall a. a -> [a] -> NonEmpty a
:| []
noFallback :: NonEmpty EpheCalcOption
noFallback = EpheCalcOption
IncludeSpeed EpheCalcOption -> [EpheCalcOption] -> NonEmpty EpheCalcOption
forall a. a -> [a] -> NonEmpty a
:| [EpheCalcOption
MustUseStoredEphe]
mkEphemerisStrict ::
NonEmpty PlanetListOption ->
NonEmpty EpheCalcOption ->
JulianDayTT ->
EpheVector ->
Ephemeris (Maybe Double)
mkEphemerisStrict :: NonEmpty PlanetListOption
-> NonEmpty EpheCalcOption
-> JulianDayTT
-> EpheVector
-> Ephemeris (Maybe Double)
mkEphemerisStrict NonEmpty PlanetListOption
planetOptions NonEmpty EpheCalcOption
calcOptions JulianDayTT
time EpheVector
results' =
Ephemeris :: forall a.
JulianDayTT
-> a -> a -> Vector (EphemerisPosition a) -> Ephemeris a
Ephemeris
{ epheDate :: JulianDayTT
epheDate = JulianDayTT
time,
epheEcliptic :: Maybe Double
epheEcliptic = Maybe Double
ecl Maybe Double -> [PlanetListOption] -> Maybe Double
forall a. Maybe a -> [PlanetListOption] -> Maybe a
`givenPlanetOptions` [PlanetListOption
IncludeEcliptic, PlanetListOption
IncludeAll],
epheNutation :: Maybe Double
epheNutation = Maybe Double
nut Maybe Double -> [PlanetListOption] -> Maybe Double
forall a. Maybe a -> [PlanetListOption] -> Maybe a
`givenPlanetOptions` [PlanetListOption
IncludeNutation, PlanetListOption
IncludeAll],
ephePositions :: Vector (EphemerisPosition (Maybe Double))
ephePositions = Vector (EphemerisPosition (Maybe Double))
ps
}
where
givenPlanetOptions :: Maybe a -> [PlanetListOption] -> Maybe a
givenPlanetOptions Maybe a
val [PlanetListOption]
opts =
if [PlanetListOption] -> Bool
hasPlanetOptions [PlanetListOption]
opts then Maybe a
val else Maybe a
forall a. Maybe a
Nothing
hasPlanetOptions :: [PlanetListOption] -> Bool
hasPlanetOptions = Bool -> Bool
not (Bool -> Bool)
-> ([PlanetListOption] -> Bool) -> [PlanetListOption] -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [PlanetListOption] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null ([PlanetListOption] -> Bool)
-> ([PlanetListOption] -> [PlanetListOption])
-> [PlanetListOption]
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [PlanetListOption] -> [PlanetListOption] -> [PlanetListOption]
forall a. Eq a => [a] -> [a] -> [a]
intersect (NonEmpty PlanetListOption -> [PlanetListOption]
forall a. NonEmpty a -> [a]
toList NonEmpty PlanetListOption
planetOptions)
givenCalcOptions :: a -> [EpheCalcOption] -> Maybe a
givenCalcOptions a
val [EpheCalcOption]
opts =
if [EpheCalcOption] -> Bool
hasCalcOptions [EpheCalcOption]
opts then a -> Maybe a
forall a. a -> Maybe a
Just a
val else Maybe a
forall a. Maybe a
Nothing
hasCalcOptions :: [EpheCalcOption] -> Bool
hasCalcOptions = Bool -> Bool
not (Bool -> Bool)
-> ([EpheCalcOption] -> Bool) -> [EpheCalcOption] -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [EpheCalcOption] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null ([EpheCalcOption] -> Bool)
-> ([EpheCalcOption] -> [EpheCalcOption])
-> [EpheCalcOption]
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [EpheCalcOption] -> [EpheCalcOption] -> [EpheCalcOption]
forall a. Eq a => [a] -> [a] -> [a]
intersect (NonEmpty EpheCalcOption -> [EpheCalcOption]
forall a. NonEmpty a -> [a]
toList NonEmpty EpheCalcOption
calcOptions)
singleFactors :: Int
singleFactors = EpheConst -> Int
unConst EpheConst
numberOfFactors
results :: Vector Double
results = EpheVector -> Vector Double
forall (v :: * -> *) a (w :: * -> *).
(Vector v a, Vector w a) =>
v a -> w a
V.convert EpheVector
results'
(Vector Double
factors, Vector Double
speeds) = Int -> Vector Double -> (Vector Double, Vector Double)
forall a. Int -> Vector a -> (Vector a, Vector a)
V.splitAt Int
singleFactors Vector Double
results
ecl :: Maybe Double
ecl = Vector Double
factors Vector Double -> Int -> Maybe Double
forall a. Vector a -> Int -> Maybe a
V.!? EpheConst -> Int
unConst EpheConst
eclipticIndex
nut :: Maybe Double
nut = Vector Double
factors Vector Double -> Int -> Maybe Double
forall a. Vector a -> Int -> Maybe a
V.!? EpheConst -> Int
unConst EpheConst
nutationIndex
ps :: Vector (EphemerisPosition (Maybe Double))
ps = (Double -> Double -> Planet -> EphemerisPosition (Maybe Double))
-> Vector Double
-> Vector Double
-> Vector Planet
-> Vector (EphemerisPosition (Maybe Double))
forall a b c d.
(a -> b -> c -> d) -> Vector a -> Vector b -> Vector c -> Vector d
V.zipWith3 Double -> Double -> Planet -> EphemerisPosition (Maybe Double)
forall a. a -> a -> Planet -> EphemerisPosition (Maybe a)
mkEphePos Vector Double
factors Vector Double
speeds ([Planet] -> Vector Planet
forall a. [a] -> Vector a
V.fromList [Planet]
placalcOrdering)
mkEphePos :: a -> a -> Planet -> EphemerisPosition (Maybe a)
mkEphePos a
planetPos a
planetSpeed Planet
planet' =
EphemerisPosition :: forall a. Planet -> a -> a -> EphemerisPosition a
EphemerisPosition
{ ephePlanet :: Planet
ephePlanet = Planet
planet',
epheLongitude :: Maybe a
epheLongitude = a -> Maybe a
forall a. a -> Maybe a
Just a
planetPos,
epheSpeed :: Maybe a
epheSpeed = a
planetSpeed a -> [EpheCalcOption] -> Maybe a
forall a. a -> [EpheCalcOption] -> Maybe a
`givenCalcOptions` [EpheCalcOption
IncludeSpeed]
}
mkEphemerisSimple ::
NonEmpty PlanetListOption ->
NonEmpty EpheCalcOption ->
JulianDayTT ->
EpheVector ->
Ephemeris Double
mkEphemerisSimple :: NonEmpty PlanetListOption
-> NonEmpty EpheCalcOption
-> JulianDayTT
-> EpheVector
-> Ephemeris Double
mkEphemerisSimple NonEmpty PlanetListOption
_ NonEmpty EpheCalcOption
_ JulianDayTT
time EpheVector
results' =
Ephemeris :: forall a.
JulianDayTT
-> a -> a -> Vector (EphemerisPosition a) -> Ephemeris a
Ephemeris
{ epheDate :: JulianDayTT
epheDate = JulianDayTT
time,
epheEcliptic :: Double
epheEcliptic = Double
ecl,
epheNutation :: Double
epheNutation = Double
nut,
ephePositions :: Vector (EphemerisPosition Double)
ephePositions = Vector (EphemerisPosition Double)
ps
}
where
singleFactors :: Int
singleFactors = EpheConst -> Int
unConst EpheConst
numberOfFactors
results :: Vector Double
results = EpheVector -> Vector Double
forall (v :: * -> *) a (w :: * -> *).
(Vector v a, Vector w a) =>
v a -> w a
V.convert EpheVector
results'
(Vector Double
factors, Vector Double
speeds) = Int -> Vector Double -> (Vector Double, Vector Double)
forall a. Int -> Vector a -> (Vector a, Vector a)
V.splitAt Int
singleFactors Vector Double
results
ecl :: Double
ecl = Vector Double
factors Vector Double -> Int -> Double
forall a. Vector a -> Int -> a
V.! EpheConst -> Int
unConst EpheConst
eclipticIndex
nut :: Double
nut = Vector Double
factors Vector Double -> Int -> Double
forall a. Vector a -> Int -> a
V.! EpheConst -> Int
unConst EpheConst
nutationIndex
ps :: Vector (EphemerisPosition Double)
ps = (Double -> Double -> Planet -> EphemerisPosition Double)
-> Vector Double
-> Vector Double
-> Vector Planet
-> Vector (EphemerisPosition Double)
forall a b c d.
(a -> b -> c -> d) -> Vector a -> Vector b -> Vector c -> Vector d
V.zipWith3 Double -> Double -> Planet -> EphemerisPosition Double
forall a. a -> a -> Planet -> EphemerisPosition a
mkEphePos Vector Double
factors Vector Double
speeds ([Planet] -> Vector Planet
forall a. [a] -> Vector a
V.fromList [Planet]
placalcOrdering)
mkEphePos :: a -> a -> Planet -> EphemerisPosition a
mkEphePos a
planetPos a
planetSpeed Planet
planet' =
EphemerisPosition :: forall a. Planet -> a -> a -> EphemerisPosition a
EphemerisPosition
{ ephePlanet :: Planet
ephePlanet = Planet
planet',
epheLongitude :: a
epheLongitude = a
planetPos,
epheSpeed :: a
epheSpeed = a
planetSpeed
}
readEphemerisRaw ::
PlanetListFlag ->
EpheCalcFlag ->
JulianDayTT ->
IO (Either String EpheVector)
readEphemerisRaw :: PlanetListFlag
-> EpheCalcFlag -> JulianDayTT -> IO (Either String EpheVector)
readEphemerisRaw PlanetListFlag
plalist EpheCalcFlag
flag JulianDayTT
timeTT =
(CString -> IO (Either String EpheVector))
-> IO (Either String EpheVector)
forall b. (CString -> IO b) -> IO b
allocaErrorMessage ((CString -> IO (Either String EpheVector))
-> IO (Either String EpheVector))
-> (CString -> IO (Either String EpheVector))
-> IO (Either String EpheVector)
forall a b. (a -> b) -> a -> b
$ \CString
serr -> do
Ptr CDouble
ephe <-
CDouble
-> PlanetListFlag -> EpheCalcFlag -> CString -> IO (Ptr CDouble)
c_dephread2
(Double -> CDouble
forall a b. (Real a, Fractional b) => a -> b
realToFrac (Double -> CDouble)
-> (JulianDayTT -> Double) -> JulianDayTT -> CDouble
forall b c a. (b -> c) -> (a -> b) -> a -> c
. JulianDayTT -> Double
forall (s :: TimeStandard). JulianDay s -> Double
getJulianDay (JulianDayTT -> CDouble) -> JulianDayTT -> CDouble
forall a b. (a -> b) -> a -> b
$ JulianDayTT
timeTT)
PlanetListFlag
plalist
EpheCalcFlag
flag
CString
serr
if Ptr CDouble
ephe Ptr CDouble -> Ptr CDouble -> Bool
forall a. Eq a => a -> a -> Bool
== Ptr CDouble
forall a. Ptr a
nullPtr
then do
String
err <- CString -> IO String
peekCAString CString
serr
Either String EpheVector -> IO (Either String EpheVector)
forall (m :: * -> *) a. Monad m => a -> m a
return (Either String EpheVector -> IO (Either String EpheVector))
-> Either String EpheVector -> IO (Either String EpheVector)
forall a b. (a -> b) -> a -> b
$ String -> Either String EpheVector
forall a b. a -> Either a b
Left String
err
else do
let noFactors :: Int
noFactors = CInt -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (CInt -> Int) -> CInt -> Int
forall a b. (a -> b) -> a -> b
$ CInt
2 CInt -> CInt -> CInt
forall a. Num a => a -> a -> a
* EpheConst -> CInt
unEpheConst EpheConst
numberOfFactors
[CDouble]
factors <- Int -> Ptr CDouble -> IO [CDouble]
forall a. Storable a => Int -> Ptr a -> IO [a]
peekArray Int
noFactors Ptr CDouble
ephe
let vector :: EpheVector
vector = [Double] -> EpheVector
forall a. Unbox a => [a] -> Vector a
VU.fromList ([Double] -> EpheVector)
-> ([CDouble] -> [Double]) -> [CDouble] -> EpheVector
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (CDouble -> Double) -> [CDouble] -> [Double]
forall a b. (a -> b) -> [a] -> [b]
map CDouble -> Double
forall a b. (Real a, Fractional b) => a -> b
realToFrac ([CDouble] -> EpheVector) -> [CDouble] -> EpheVector
forall a b. (a -> b) -> a -> b
$ [CDouble]
factors
Either String EpheVector -> IO (Either String EpheVector)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Either String EpheVector -> IO (Either String EpheVector))
-> Either String EpheVector -> IO (Either String EpheVector)
forall a b. (a -> b) -> a -> b
$ EpheVector -> Either String EpheVector
forall a b. b -> Either a b
Right EpheVector
vector
readEphemerisRawNoFallback :: JulianDayTT -> IO (Either String EpheVector)
readEphemerisRawNoFallback :: JulianDayTT -> IO (Either String EpheVector)
readEphemerisRawNoFallback =
PlanetListFlag
-> EpheCalcFlag -> JulianDayTT -> IO (Either String EpheVector)
readEphemerisRaw PlanetListFlag
calculateAll EpheCalcFlag
addSpeedNoFallback
where
calculateAll :: PlanetListFlag
calculateAll = CInt -> PlanetListFlag
PlanetListFlag CInt
0
addSpeedNoFallback :: EpheCalcFlag
addSpeedNoFallback =
[EpheCalcFlag] -> EpheCalcFlag
foldEpheCalcOptions ([EpheCalcFlag] -> EpheCalcFlag) -> [EpheCalcFlag] -> EpheCalcFlag
forall a b. (a -> b) -> a -> b
$ (EpheCalcOption -> EpheCalcFlag)
-> [EpheCalcOption] -> [EpheCalcFlag]
forall a b. (a -> b) -> [a] -> [b]
map EpheCalcOption -> EpheCalcFlag
epheOptionToFlag [EpheCalcOption
IncludeSpeed, EpheCalcOption
MustUseStoredEphe]
writeEphemeris :: EphemerisBlockNumber -> IO (Either String EphemerisBlockNumber)
writeEphemeris :: EphemerisBlockNumber -> IO (Either String EphemerisBlockNumber)
writeEphemeris bn :: EphemerisBlockNumber
bn@(EphemerisBlockNumber Int
n) = do
(CString -> IO (Either String EphemerisBlockNumber))
-> IO (Either String EphemerisBlockNumber)
forall b. (CString -> IO b) -> IO b
allocaErrorMessage ((CString -> IO (Either String EphemerisBlockNumber))
-> IO (Either String EphemerisBlockNumber))
-> (CString -> IO (Either String EphemerisBlockNumber))
-> IO (Either String EphemerisBlockNumber)
forall a b. (a -> b) -> a -> b
$ \CString
serr -> do
CInt
retval <-
CInt -> CString -> IO CInt
c_ephe4_write_file (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
n) CString
serr
if CInt
retval CInt -> CInt -> Bool
forall a. Ord a => a -> a -> Bool
< CInt
0
then do
String
err <- CString -> IO String
peekCAString CString
serr
Either String EphemerisBlockNumber
-> IO (Either String EphemerisBlockNumber)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Either String EphemerisBlockNumber
-> IO (Either String EphemerisBlockNumber))
-> Either String EphemerisBlockNumber
-> IO (Either String EphemerisBlockNumber)
forall a b. (a -> b) -> a -> b
$ String -> Either String EphemerisBlockNumber
forall a b. a -> Either a b
Left String
err
else Either String EphemerisBlockNumber
-> IO (Either String EphemerisBlockNumber)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Either String EphemerisBlockNumber
-> IO (Either String EphemerisBlockNumber))
-> Either String EphemerisBlockNumber
-> IO (Either String EphemerisBlockNumber)
forall a b. (a -> b) -> a -> b
$ EphemerisBlockNumber -> Either String EphemerisBlockNumber
forall a b. b -> Either a b
Right EphemerisBlockNumber
bn
unConst :: EpheConst -> Int
unConst :: EpheConst -> Int
unConst = CInt -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (CInt -> Int) -> (EpheConst -> CInt) -> EpheConst -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. EpheConst -> CInt
unEpheConst
foldEpheCalcOptions :: [EpheCalcFlag] -> EpheCalcFlag
foldEpheCalcOptions :: [EpheCalcFlag] -> EpheCalcFlag
foldEpheCalcOptions = CInt -> EpheCalcFlag
EpheCalcFlag (CInt -> EpheCalcFlag)
-> ([EpheCalcFlag] -> CInt) -> [EpheCalcFlag] -> EpheCalcFlag
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (EpheCalcFlag -> CInt -> CInt) -> CInt -> [EpheCalcFlag] -> CInt
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (CInt -> CInt -> CInt
forall a. Bits a => a -> a -> a
(.|.) (CInt -> CInt -> CInt)
-> (EpheCalcFlag -> CInt) -> EpheCalcFlag -> CInt -> CInt
forall b c a. (b -> c) -> (a -> b) -> a -> c
. EpheCalcFlag -> CInt
unEpheCalcFlag) CInt
0
epheOptionToFlag :: EpheCalcOption -> EpheCalcFlag
epheOptionToFlag :: EpheCalcOption -> EpheCalcFlag
epheOptionToFlag =
\case
EpheCalcOption
IncludeSpeed -> EpheCalcFlag
includeSpeed
EpheCalcOption
MustUseStoredEphe -> EpheCalcFlag
mustUseStoredEphe
foldPlanetListOptions :: [PlanetListFlag] -> PlanetListFlag
foldPlanetListOptions :: [PlanetListFlag] -> PlanetListFlag
foldPlanetListOptions = CInt -> PlanetListFlag
PlanetListFlag (CInt -> PlanetListFlag)
-> ([PlanetListFlag] -> CInt) -> [PlanetListFlag] -> PlanetListFlag
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (PlanetListFlag -> CInt -> CInt)
-> CInt -> [PlanetListFlag] -> CInt
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (CInt -> CInt -> CInt
forall a. Bits a => a -> a -> a
(.|.) (CInt -> CInt -> CInt)
-> (PlanetListFlag -> CInt) -> PlanetListFlag -> CInt -> CInt
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PlanetListFlag -> CInt
unPlanetListFlag) CInt
0
planetListOptionToFlag :: PlanetListOption -> PlanetListFlag
planetListOptionToFlag :: PlanetListOption -> PlanetListFlag
planetListOptionToFlag =
\case
PlanetListOption
IncludeAllPlanets -> PlanetListFlag
includeAllPlanets
PlanetListOption
IncludeEcliptic -> PlanetListFlag
includeEcliptic
PlanetListOption
IncludeNutation -> PlanetListFlag
includeNutation
PlanetListOption
IncludeAll -> PlanetListFlag
includeAll
placalcOrdering :: [Planet]
placalcOrdering :: [Planet]
placalcOrdering =
[ Planet
Sun,
Planet
Moon,
Planet
Mercury,
Planet
Venus,
Planet
Mars,
Planet
Jupiter,
Planet
Saturn,
Planet
Uranus,
Planet
Neptune,
Planet
Pluto,
Planet
MeanNode,
Planet
TrueNode,
Planet
Chiron,
Planet
MeanApog
]
planetToPlanetOption :: Planet -> Maybe PlacalcPlanet
planetToPlanetOption :: Planet -> Maybe PlacalcPlanet
planetToPlanetOption =
\case
Planet
Sun -> PlacalcPlanet -> Maybe PlacalcPlanet
forall a. a -> Maybe a
Just PlacalcPlanet
pSun
Planet
Moon -> PlacalcPlanet -> Maybe PlacalcPlanet
forall a. a -> Maybe a
Just PlacalcPlanet
pMoon
Planet
Mercury -> PlacalcPlanet -> Maybe PlacalcPlanet
forall a. a -> Maybe a
Just PlacalcPlanet
pMercury
Planet
Venus -> PlacalcPlanet -> Maybe PlacalcPlanet
forall a. a -> Maybe a
Just PlacalcPlanet
pVenus
Planet
Mars -> PlacalcPlanet -> Maybe PlacalcPlanet
forall a. a -> Maybe a
Just PlacalcPlanet
pMars
Planet
Jupiter -> PlacalcPlanet -> Maybe PlacalcPlanet
forall a. a -> Maybe a
Just PlacalcPlanet
pJupiter
Planet
Saturn -> PlacalcPlanet -> Maybe PlacalcPlanet
forall a. a -> Maybe a
Just PlacalcPlanet
pSaturn
Planet
Uranus -> PlacalcPlanet -> Maybe PlacalcPlanet
forall a. a -> Maybe a
Just PlacalcPlanet
pUranus
Planet
Neptune -> PlacalcPlanet -> Maybe PlacalcPlanet
forall a. a -> Maybe a
Just PlacalcPlanet
pNeptune
Planet
Pluto -> PlacalcPlanet -> Maybe PlacalcPlanet
forall a. a -> Maybe a
Just PlacalcPlanet
pPluto
Planet
MeanNode -> PlacalcPlanet -> Maybe PlacalcPlanet
forall a. a -> Maybe a
Just PlacalcPlanet
pMeanNode
Planet
TrueNode -> PlacalcPlanet -> Maybe PlacalcPlanet
forall a. a -> Maybe a
Just PlacalcPlanet
pTrueNode
Planet
Chiron -> PlacalcPlanet -> Maybe PlacalcPlanet
forall a. a -> Maybe a
Just PlacalcPlanet
pChiron
Planet
MeanApog -> PlacalcPlanet -> Maybe PlacalcPlanet
forall a. a -> Maybe a
Just PlacalcPlanet
pLilith
Planet
_ -> Maybe PlacalcPlanet
forall a. Maybe a
Nothing