packages feed

commodities-0.1.0: Ledger/Commodity/Print.hs

{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}

module Ledger.Commodity.Print where

import           Control.Applicative
import           Control.Lens
import           Control.Monad.Reader.Class
import           Control.Monad.Trans.Writer
import qualified Data.IntMap.Strict as IntMap
import           Data.Text.Lazy
import           Data.Text.Lazy.Builder
import           Ledger.Balance
import           Ledger.Commodity

printAmount :: (MonadReader CommodityMap m, Functor m, Show a)
            => Balance a
            -> m Text
printAmount Zero = return "0"
printAmount (Plain x) = return $ pack (show x)
printAmount x = toLazyText <$> execWriterT (buildAmount x)

buildAmount :: (MonadReader CommodityMap m, Show a)
            => Balance a
            -> WriterT Builder m ()
buildAmount (Amount c q) = do
    mcomm <- view (commodities.at c)
    case mcomm of
        Nothing -> error "Attempted to print an unknown commodity"
        Just comm -> do
            tell $ fromText (comm^.commSymbol)
            tell $ fromString (show q)

buildAmount (Balance xs) =
    mapM_ (buildAmount . uncurry Amount) $ IntMap.toList xs

buildAmount _ = return ()