content: {-# LANGUAGE FlexibleContexts #-}
  {-# LANGUAGE TemplateHaskell  #-}
  
  -- | Internal stream related functions.
  --   These are exported because they're tested like this.
  --   It's not expected a user would need this.
  module Codec.Xlsx.Writer.Internal.Stream
    ( upsertSharedString
    , initialSharedString
    , string_map
    , SharedStringState(..)
    ) where
  
  
  import Codec.Xlsx.LensCompat
  import Control.Monad.State.Strict
  import Data.Map.Strict (Map)
  import Data.Maybe
  import Data.Text (Text)
  
  newtype SharedStringState = MkSharedStringState
    { _string_map :: Map Text Int
    }
  makeLenses 'MkSharedStringState
  
  initialSharedString :: SharedStringState
  initialSharedString = MkSharedStringState mempty
  
  -- properties:
  -- for a list of [text], every unique text gets a unique number.
  upsertSharedString :: MonadState SharedStringState m => Text -> m (Text,Int)
  upsertSharedString current = do
    strings  <- use string_map
  
    let mIdx :: Maybe Int
        mIdx = strings ^? ix current
  
        idx :: Int
        idx = fromMaybe (length strings) mIdx
  
        newMap :: Map Text Int
        newMap = at current ?~ idx $ strings
  
    string_map .= newMap
    pure (current, idx)
  
  