commodities 0.1.0 → 0.2.0
raw patch · 5 files changed
+49/−34 lines, 5 filesdep +comonaddep −comonad-transformersdep −representable-functorsdep ~lensdep ~semigroupoids
Dependencies added: comonad
Dependencies removed: comonad-transformers, representable-functors
Dependency ranges changed: lens, semigroupoids
Files
- Ledger/Balance.hs +2/−1
- Ledger/Commodity/Parse.hs +9/−6
- Ledger/Commodity/Print.hs +33/−21
- commodities.cabal +4/−5
- test/doctests.hs +1/−1
Ledger/Balance.hs view
@@ -5,6 +5,7 @@ {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE PackageImports #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TypeFamilies #-}@@ -22,7 +23,7 @@ ) where import Control.Applicative-import Control.Comonad.Trans.Store+import "comonad" Control.Comonad.Trans.Store import Control.Lens hiding (from, to) import qualified Control.Lens.Internal as Lens import Control.Monad hiding (forM)
Ledger/Commodity/Parse.hs view
@@ -1,9 +1,12 @@+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE PackageImports #-}+ module Ledger.Commodity.Parse where -import Control.Monad.Trans.State-import Data.Text-import Ledger.Balance-import Ledger.Commodity+import "mtl" Control.Monad.State.Class+import Data.Text.Lazy+import Ledger.Balance+import Ledger.Commodity -parseAmount :: Text -> State CommodityMap (Balance a)-parseAmount _str = undefined+parseBalance :: MonadState CommodityMap m => Text -> m (Balance a)+parseBalance _str = undefined
Ledger/Commodity/Print.hs view
@@ -1,38 +1,50 @@ {-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE ImpredicativeTypes #-} {-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE PackageImports #-} -module Ledger.Commodity.Print where+module Ledger.Commodity.Print+ ( printBalance+ , balance+ ) where import Control.Applicative import Control.Lens-import Control.Monad.Reader.Class+import "mtl" Control.Monad.Reader.Class+import Control.Monad.Trans.Reader (runReader)+import Control.Monad.Trans.State (evalState) import Control.Monad.Trans.Writer import qualified Data.IntMap.Strict as IntMap+import Data.Maybe (fromMaybe) import Data.Text.Lazy import Data.Text.Lazy.Builder import Ledger.Balance import Ledger.Commodity+import Ledger.Commodity.Parse -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)+printBalance :: (MonadReader CommodityMap m, Functor m, Show a)+ => Balance a+ -> m Text+printBalance Zero = return "0"+printBalance (Plain x) = return $ pack (show x)+printBalance x = toLazyText <$> execWriterT (buildBalance x) -buildAmount :: (MonadReader CommodityMap m, Show a)- => Balance a- -> WriterT Builder m ()-buildAmount (Amount c q) = do+buildBalance :: (MonadReader CommodityMap m, Show a)+ => Balance a+ -> WriterT Builder m ()+buildBalance (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)+ let comm = fromMaybe defaultCommodityInfo mcomm+ tell $ fromText (comm^.commSymbol)+ tell $ fromString (show q) -buildAmount (Balance xs) =- mapM_ (buildAmount . uncurry Amount) $ IntMap.toList xs+buildBalance (Balance xs) =+ mapM_ (buildBalance . uncurry Amount) $ IntMap.toList xs -buildAmount _ = return ()+buildBalance _ = return ()++balance :: Show a => CommodityMap -> Iso' (Balance a) Text+balance pool = iso toBalance fromBalance+ where+ toBalance = flip runReader pool . printBalance+ fromBalance = flip evalState pool . parseBalance
commodities.cabal view
@@ -1,5 +1,5 @@ Name: commodities-Version: 0.1.0+Version: 0.2.0 Synopsis: Library for working with commoditized amounts and price histories Description: Library for working with commoditized amounts and price histories License-file: LICENSE@@ -26,17 +26,16 @@ build-depends: base >= 3 && < 5 , PSQueue- , comonad-transformers >= 3.0.1+ , comonad >= 4.0 , containers >= 0.4 , distributive >= 0.3 , keys >= 3.0.2- , lens >= 3.7+ , lens >= 3.10 , linear >= 0.7 , mtl , numbers >= 2009.8.9- , representable-functors >= 3.0.1 , semigroups- , semigroupoids >= 3.0.2+ , semigroupoids >= 4.0 , text >= 0.11.2 , thyme , transformers
test/doctests.hs view
@@ -16,7 +16,7 @@ : sources getSources :: IO [FilePath]-getSources = filter (\x -> ".hs" `isSuffixOf` x) <$> go "src"+getSources = filter (\x -> ".hs" `isSuffixOf` x) <$> go "Ledger" where go dir = do (dirs, files) <- getFilesAndDirectories dir