national-australia-bank 0.0.1 → 0.0.2
raw patch · 3 files changed
+149/−1 lines, 3 filesdep +containers
Dependencies added: containers
Files
- changelog.md +4/−0
- national-australia-bank.cabal +3/−1
- src/Data/Bank/Combinators.hs +142/−0
changelog.md view
@@ -1,3 +1,7 @@+0.0.2++* Add combinators for processing bank transactions+ 0.0.1 * This change log starts
national-australia-bank.cabal view
@@ -1,5 +1,5 @@ name: national-australia-bank-version: 0.0.1+version: 0.0.2 synopsis: Functions for National Australia Bank transactions description: Parsing, Processing and other functions for National Australia Bank transactions license: BSD3@@ -21,10 +21,12 @@ library exposed-modules:+ Data.Bank.Combinators Data.Bank.NationalAustraliaBank.NationalAustraliaBank build-depends: base >= 4.9 && < 4.15 , bytestring == 0.10.8.2+ , containers == 0.6.0.1 , digit == 0.12 , directory == 1.3.6.1 , filepath == 1.4.2.1
+ src/Data/Bank/Combinators.hs view
@@ -0,0 +1,142 @@+{-# OPTIONS_GHC -Wall #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE FlexibleContexts #-}++module Data.Bank.Combinators where++import Control.Applicative (Applicative(liftA2))+import Control.Category (Category(..) )+import Control.Lens+ ( _Left,+ isn't )+import Control.Monad.State+ ( Monad((>>=)) )+import Data.Bool(bool)+import qualified Data.List as List ( isInfixOf )+import Data.Functor( Functor(..) )+import Data.Functor.Identity ( Identity(..) )+import Data.Set(Set)+import qualified Data.Set as Set(singleton)+import Data.List.NonEmpty ( some1 )+import Text.Parsec+ ( char,+ noneOf,+ string,+ eof,+ parse,+ try,+ Parsec,+ ParsecT,+ Stream )+import Prelude hiding (id, (.) )++contains ::+ (Eq a, Functor f) =>+ [a]+ -> f [a]+ -> f Bool+contains =+ fmap . List.isInfixOf++equals ::+ (Eq a, Functor f) =>+ a+ -> f a+ -> f Bool+equals =+ fmap . (==)++(~~) ::+ a+ -> (a -> b)+ -> b+a ~~ f =+ f a++infixl 8 ~~++(~>) ::+ (Functor f, Monoid c) =>+ f Bool+ -> c+ -> f c+b ~> c =+ fmap (bool mempty c) b++infixr 7 ~>++(~>>) ::+ (Ord c, Functor f) =>+ f Bool+ -> c+ -> f (Set c)+b ~>> c =+ b ~> Set.singleton c++infixl 7 ~>>++parses ::+ (Functor f, Stream s Identity t) =>+ Parsec s () c+ -> f s+ -> f Bool+parses p =+ fmap (isn't _Left . parse (try p) "parses")++parenthesisedParser ::+ Stream s m Char =>+ String+ -> ParsecT s u m ()+parenthesisedParser s =+ string s *> string " (" *> some1 (noneOf ")") *> char ')' *> eof++parenthesised ::+ (Functor f, Stream s Identity Char) =>+ String+ -> f s+ -> f Bool+parenthesised =+ parses . parenthesisedParser++(...) ::+ (Monad f, Foldable g) =>+ (a -> f a -> f Bool)+ -> g a+ -> (f a -> f Bool)+f ... t =+ \x ->+ foldr (\a b -> f a x .||. b) (pure False) t++infixl 9 ...++(.||.) ::+ Monad f =>+ f Bool+ -> f Bool+ -> f Bool+p .||. q =+ p >>= bool q (pure True)++(.|||.) ::+ (Applicative f, Applicative g, Monad h) =>+ f (g (h Bool))+ -> f (g (h Bool))+ -> f (g (h Bool))+(.|||.) =+ liftA2 (liftA2 (.||.))++(.&&.) ::+ Monad f =>+ f Bool+ -> f Bool+ -> f Bool+p .&&. q =+ p >>= bool (pure False) q++(.&&&.) ::+ (Applicative f, Applicative g, Monad h) =>+ f (g (h Bool))+ -> f (g (h Bool))+ -> f (g (h Bool))+(.&&&.) =+ liftA2 (liftA2 (.&&.))