simfin-1.0.0: src/SimFin/Types/StockRef.hs
{-|
Module : SimFin.Types.StockRef
Description : Type to represent a reference to a company.
Copyright : (c) Owen Shepherd, 2022
License : MIT
Maintainer : owen@owen.cafe
-}
{-# LANGUAGE OverloadedStrings #-}
module SimFin.Types.StockRef
( StockRef(..)
, stockRefsToQueryParams
) where
import Control.Arrow (first, second)
import Data.List (foldl')
import Data.List.NonEmpty (NonEmpty)
import Data.String
import Data.Text (Text)
import qualified Data.Text as T
import SimFin.Internal
-- | A stock ref is a SimSin ID or a ticker.
data StockRef = SimFinId Int | Ticker Text
deriving Show
instance IsString StockRef where
fromString = Ticker . T.pack
-- | Collection of discriminations to discrimination of collections.
separateStockRefs :: Foldable t => t StockRef -> ([Int], [Text])
separateStockRefs = foldl' f ([], [])
where
f :: ([Int], [Text]) -> StockRef -> ([Int], [Text])
f acc (SimFinId n) = first (n:) acc
f acc (Ticker t) = second (t:) acc
-- | Convert one or more stock references into a list of query parameters.
stockRefsToQueryParams :: NonEmpty StockRef -> [QueryParam]
stockRefsToQueryParams refs =
let
(ids, tickers) = separateStockRefs refs
tickerParam = toTextCommaQueryParam "ticker" tickers
idParam = toShownCommaQueryParam "id" ids
in tickerParam <> idParam