-- | Utility functions for making common actions easier.
module Strive.Utilities
  ( with,

    -- * Streams
    altitudeStream,
    cadenceStream,
    distanceStream,
    gradeSmoothStream,
    heartrateStream,
    latlngStream,
    movingStream,
    tempStream,
    timeStream,
    velocitySmoothStream,
    wattsStream,
  )
where

import Data.Aeson (FromJSON, Result (Error, Success), Value, fromJSON)
import Data.Default (Default, def)
import Data.Maybe (mapMaybe)
import Data.Text (pack)
import qualified Strive.Enums as Enums
import Strive.Types (StreamDetailed, streamDetailed_data, streamDetailed_type)

-- | Modify an action's default options by listing changes to it.
with :: (Default a) => [a -> a] -> a
with :: forall a. Default a => [a -> a] -> a
with = forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr forall a b. (a -> b) -> a -> b
($) forall a. Default a => a
def

altitudeStream :: StreamDetailed -> Maybe [Double]
altitudeStream :: StreamDetailed -> Maybe [Double]
altitudeStream = forall a. FromJSON a => StreamType -> StreamDetailed -> Maybe [a]
lookupStream StreamType
Enums.AltitudeStream

cadenceStream :: StreamDetailed -> Maybe [Integer]
cadenceStream :: StreamDetailed -> Maybe [Integer]
cadenceStream = forall a. FromJSON a => StreamType -> StreamDetailed -> Maybe [a]
lookupStream StreamType
Enums.CadenceStream

distanceStream :: StreamDetailed -> Maybe [Double]
distanceStream :: StreamDetailed -> Maybe [Double]
distanceStream = forall a. FromJSON a => StreamType -> StreamDetailed -> Maybe [a]
lookupStream StreamType
Enums.DistanceStream

gradeSmoothStream :: StreamDetailed -> Maybe [Double]
gradeSmoothStream :: StreamDetailed -> Maybe [Double]
gradeSmoothStream = forall a. FromJSON a => StreamType -> StreamDetailed -> Maybe [a]
lookupStream StreamType
Enums.GradeSmoothStream

heartrateStream :: StreamDetailed -> Maybe [Integer]
heartrateStream :: StreamDetailed -> Maybe [Integer]
heartrateStream = forall a. FromJSON a => StreamType -> StreamDetailed -> Maybe [a]
lookupStream StreamType
Enums.HeartrateStream

latlngStream :: StreamDetailed -> Maybe [(Double, Double)]
latlngStream :: StreamDetailed -> Maybe [(Double, Double)]
latlngStream = forall a. FromJSON a => StreamType -> StreamDetailed -> Maybe [a]
lookupStream StreamType
Enums.LatlngStream

movingStream :: StreamDetailed -> Maybe [Bool]
movingStream :: StreamDetailed -> Maybe [Bool]
movingStream = forall a. FromJSON a => StreamType -> StreamDetailed -> Maybe [a]
lookupStream StreamType
Enums.MovingStream

tempStream :: StreamDetailed -> Maybe [Integer]
tempStream :: StreamDetailed -> Maybe [Integer]
tempStream = forall a. FromJSON a => StreamType -> StreamDetailed -> Maybe [a]
lookupStream StreamType
Enums.TempStream

timeStream :: StreamDetailed -> Maybe [Integer]
timeStream :: StreamDetailed -> Maybe [Integer]
timeStream = forall a. FromJSON a => StreamType -> StreamDetailed -> Maybe [a]
lookupStream StreamType
Enums.TimeStream

velocitySmoothStream :: StreamDetailed -> Maybe [Double]
velocitySmoothStream :: StreamDetailed -> Maybe [Double]
velocitySmoothStream = forall a. FromJSON a => StreamType -> StreamDetailed -> Maybe [a]
lookupStream StreamType
Enums.VelocitySmoothStream

wattsStream :: StreamDetailed -> Maybe [Integer]
wattsStream :: StreamDetailed -> Maybe [Integer]
wattsStream = forall a. FromJSON a => StreamType -> StreamDetailed -> Maybe [a]
lookupStream StreamType
Enums.WattsStream

lookupStream :: (FromJSON a) => Enums.StreamType -> StreamDetailed -> Maybe [a]
lookupStream :: forall a. FromJSON a => StreamType -> StreamDetailed -> Maybe [a]
lookupStream StreamType
streamType StreamDetailed
stream =
  if StreamDetailed -> Text
streamDetailed_type StreamDetailed
stream forall a. Eq a => a -> a -> Bool
== String -> Text
pack (forall a. Show a => a -> String
show StreamType
streamType)
    then forall a. a -> Maybe a
Just (forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe forall a. FromJSON a => Value -> Maybe a
maybeFromJson (StreamDetailed -> [Value]
streamDetailed_data StreamDetailed
stream))
    else forall a. Maybe a
Nothing

maybeFromJson :: (FromJSON a) => Value -> Maybe a
maybeFromJson :: forall a. FromJSON a => Value -> Maybe a
maybeFromJson Value
value = case forall a. FromJSON a => Value -> Result a
fromJSON Value
value of
  Success a
x -> forall a. a -> Maybe a
Just a
x
  Error String
_ -> forall a. Maybe a
Nothing