packages feed

bidispec 0.1 → 0.1.3

raw patch · 2 files changed

+29/−14 lines, 2 filesdep ~basenew-uploaderPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependency ranges changed: base

API changes (from Hackage documentation)

- Data.BidiSpec: instance (Error e) => MonadError e (SpecParser s e)
- Data.BidiSpec: instance (Error e) => MonadPlus (SpecParser s e)
- Data.BidiSpec: instance (Error e) => MonadReader s (SpecParser s e)
+ Data.BidiSpec: instance Error e => MonadError e (SpecParser s e)
+ Data.BidiSpec: instance Error e => MonadPlus (SpecParser s e)
+ Data.BidiSpec: instance Error e => MonadReader s (SpecParser s e)
+ Data.BidiSpec: rsDefault :: Error e => (e -> a) -> Spec e u i a -> Spec e u i a
+ Data.BidiSpec: rsMaybe :: Error e => Spec e i o a -> Spec e i o (Maybe a)
+ Data.BidiSpec: rsMaybeDefault :: Error e => a -> Spec e i o a -> Spec e i o a
- Data.BidiSpec: genBySpec :: (Monad m) => Spec e i o a -> o -> a -> m o
+ Data.BidiSpec: genBySpec :: Monad m => Spec e i o a -> o -> a -> m o
- Data.BidiSpec: parseBySpec :: (MonadError e m) => Spec e i o a -> i -> m a
+ Data.BidiSpec: parseBySpec :: MonadError e m => Spec e i o a -> i -> m a
- Data.BidiSpec: rsAlt :: (Error e) => (a -> Int) -> [Spec e i o a] -> Spec e i o a
+ Data.BidiSpec: rsAlt :: Error e => (a -> Int) -> [Spec e i o a] -> Spec e i o a
- Data.BidiSpec: rsCase :: (Error e) => (a -> b, b -> a) -> Spec e i o a -> SpecCase e i o b
+ Data.BidiSpec: rsCase :: Error e => (a -> b, b -> a) -> Spec e i o a -> SpecCase e i o b
- Data.BidiSpec: rsCaseConst :: (Error e) => a -> (Spec e i o b -> Spec e i o b) -> SpecCase e i o a
+ Data.BidiSpec: rsCaseConst :: Error e => a -> (Spec e i o b -> Spec e i o b) -> SpecCase e i o a
- Data.BidiSpec: rsCheckSet :: (Error e) => SpecParser i e () -> (o -> o) -> Spec e i o a -> Spec e i o a
+ Data.BidiSpec: rsCheckSet :: Error e => SpecParser i e () -> (o -> o) -> Spec e i o a -> Spec e i o a
- Data.BidiSpec: rsChoice :: (Error e) => Spec e i o b -> Spec e i o a -> (a -> Spec e i o b) -> Spec e i o b
+ Data.BidiSpec: rsChoice :: Error e => Spec e i o b -> Spec e i o a -> (a -> Spec e i o b) -> Spec e i o b
- Data.BidiSpec: rsCondSeq :: (Error e) => Spec e i o b -> (b -> a) -> Spec e i o a -> (a -> Spec e i o b) -> Spec e i o b
+ Data.BidiSpec: rsCondSeq :: Error e => Spec e i o b -> (b -> a) -> Spec e i o a -> (a -> Spec e i o b) -> Spec e i o b
- Data.BidiSpec: rsGetSet :: (Error e) => (i -> a) -> (o -> a -> o) -> Spec e i o a
+ Data.BidiSpec: rsGetSet :: Error e => (i -> a) -> (o -> a -> o) -> Spec e i o a
- Data.BidiSpec: rsLift :: (Error e) => a -> Spec e i o a
+ Data.BidiSpec: rsLift :: Error e => a -> Spec e i o a
- Data.BidiSpec: rsPair :: (Error e) => Spec e i o a -> Spec e i o b -> Spec e i o (a, b)
+ Data.BidiSpec: rsPair :: Error e => Spec e i o a -> Spec e i o b -> Spec e i o (a, b)
- Data.BidiSpec: rsQuadruple :: (Error e) => Spec e i o a -> Spec e i o b -> Spec e i o c -> Spec e i o d -> Spec e i o (a, b, c, d)
+ Data.BidiSpec: rsQuadruple :: Error e => Spec e i o a -> Spec e i o b -> Spec e i o c -> Spec e i o d -> Spec e i o (a, b, c, d)
- Data.BidiSpec: rsTriple :: (Error e) => Spec e i o a -> Spec e i o b -> Spec e i o c -> Spec e i o (a, b, c)
+ Data.BidiSpec: rsTriple :: Error e => Spec e i o a -> Spec e i o b -> Spec e i o c -> Spec e i o (a, b, c)
- Data.BidiSpec: rsUnit :: (Error e) => Spec e i o ()
+ Data.BidiSpec: rsUnit :: Error e => Spec e i o ()
- Data.BidiSpec: rsWrap :: (Error e) => (a -> b, b -> a) -> Spec e i o a -> Spec e i o b
+ Data.BidiSpec: rsWrap :: Error e => (a -> b, b -> a) -> Spec e i o a -> Spec e i o b
- Data.BidiSpec: rsWrapEither :: (Error e) => (a -> Either e b, b -> a) -> Spec e i o a -> Spec e i o b
+ Data.BidiSpec: rsWrapEither :: Error e => (a -> Either e b, b -> a) -> Spec e i o a -> Spec e i o b
- Data.BidiSpec: rsWrapMaybe :: (Error e) => String -> (a -> Maybe b, b -> a) -> Spec e i o a -> Spec e i o b
+ Data.BidiSpec: rsWrapMaybe :: Error e => String -> (a -> Maybe b, b -> a) -> Spec e i o a -> Spec e i o b
- Data.BidiSpec: rsZero :: (Error e) => Spec e i o a
+ Data.BidiSpec: rsZero :: Error e => Spec e i o a
- Data.BidiSpec: spCheck :: (Error e) => (a -> Bool) -> (a -> e) -> a -> SpecParser s e ()
+ Data.BidiSpec: spCheck :: Error e => (a -> Bool) -> (a -> e) -> a -> SpecParser s e ()
- Data.BidiSpec: spFromEither :: (Error e) => Either e a -> SpecParser s e a
+ Data.BidiSpec: spFromEither :: Error e => Either e a -> SpecParser s e a
- Data.BidiSpec: spFromMaybe :: (Error e) => e -> Maybe a -> SpecParser s e a
+ Data.BidiSpec: spFromMaybe :: Error e => e -> Maybe a -> SpecParser s e a
- Data.BidiSpec: spGet :: (Error e) => SpecParser s e s
+ Data.BidiSpec: spGet :: Error e => SpecParser s e s
- Data.BidiSpec: spGets :: (Error e) => (s -> a) -> SpecParser s e a
+ Data.BidiSpec: spGets :: Error e => (s -> a) -> SpecParser s e a

Files

bidispec.cabal view
@@ -1,5 +1,5 @@ Name:                bidispec-Version:             0.1+Version:             0.1.3 Synopsis:            Specification of generators and parsers Description:  This is a generalisation of the idea behind the XML pickle/unpickle@@ -15,6 +15,6 @@  Library   Hs-Source-Dirs:    src-  GHC-Options: -Wall-  Build-Depends:     base >= 3 && < 4, bytestring, mtl+  GHC-Options:       -Wall -fno-warn-orphans+  Build-Depends:     base >= 4 && < 5, bytestring, mtl   Exposed-Modules:   Data.BidiSpec
src/Data/BidiSpec.hs view
@@ -8,23 +8,23 @@     (Spec, SpecGen, SpecParser(..)     ,mkSpec, parseBySpec, genBySpec, runSpecParser, rsGen, rsParse     ,spGet, spGets, spCheck, spFromMaybe, spFromEither-    ,rsPair, rsTriple, rsQuadruple+    ,rsPair, rsTriple, rsQuadruple, rsMaybe     ,rsWrap, rsWrapMaybe, rsWrapEither, rsWrapEither',rsCondSeq     ,rsChoice, rsAlt, rsTagSwitch, rsSwitch, rsCase, rsCaseConst-    ,rsGetSet,rsCheckSet, rsLift, rsUnit, rsZero, rsWith+    ,rsGetSet,rsCheckSet, rsLift, rsUnit, rsZero, rsWith, rsDefault+    ,rsMaybeDefault     ) where  ---------------------------------------- -- STDLIB -----------------------------------------import Control.Monad (MonadPlus(..), msum, guard, liftM)-import Control.Monad.Error (MonadError(..), Error(..), ErrorT)+import Control.Monad (MonadPlus(..), guard, liftM)+import Control.Monad.Error (MonadError(..), Error(..)) import Control.Monad.Trans (MonadTrans, lift)-import Control.Monad.Reader (MonadReader(..), ReaderT, runReaderT, ask, asks)+import Control.Monad.Reader (MonadReader, ReaderT, runReaderT, ask, local, asks) -import Data.Maybe (fromMaybe)-import Data.List (find,elemIndex)+import Data.List (find)  -- ---------------------------------------------------------------------------- --  SpecParser@@ -135,6 +135,17 @@ rsWrap :: Error e => (a -> b, b -> a) -> Spec e i o a -> Spec e i o b rsWrap (toB,toA) = rsWrapMaybe (error "BidiSpec: rsWrap") (return . toB, toA) +rsMaybe :: Error e => Spec e i o a -> Spec e i o (Maybe a)+rsMaybe rsA = mkSpec rsParseDef rsGenDef+    where rsParseDef = liftM Just (rsParse rsA) `mplus` return Nothing+          rsGenDef rout Nothing = rout+          rsGenDef rout (Just a) = rsGen rsA rout a++rsMaybeDefault :: Error e => a -> Spec e i o a -> Spec e i o a+rsMaybeDefault defaultA rsA = mkSpec rsParseDef rsGenDef+    where rsParseDef = rsParse rsA `mplus` return defaultA+          rsGenDef = rsGen rsA+ rsWrapMaybe :: Error e =>                String                        -- error message for Maybe case             -> (a -> Maybe b, b -> a)        -- wrappers@@ -183,7 +194,7 @@          -> Spec e i o a          -> (a -> Spec e i o b)          -> Spec e i o b-rsChoice pb = rsCondSeq pb undefined+rsChoice pb = rsCondSeq pb (error "rsChoice: undefined")  rsAlt :: Error e => (a -> Int) -> [Spec e i o a] -> Spec e i o a rsAlt getIdx alts = mkSpec rsParseDef rsGenDef@@ -205,12 +216,12 @@                a                               -- constant to match/generate             -> (Spec e i o b -> Spec e i o b)  -- continuation             -> SpecCase e i o a-rsCaseConst a mkRs = rsCase (const a, const undefined) (mkRs (rsLift undef))+rsCaseConst a mkRs = rsCase (const a, const undef) (mkRs (rsLift undef))     where undef = error "rsCaseConst: this value should have been ignored"  rsSwitch :: (Error e, Show a) => [SpecCase e i o a] -> Spec e i o a-rsSwitch = rsTagSwitch (takeWhile take . dropWhile (=='(') . show)-    where take x = x /= ' ' && x /= ','+rsSwitch = rsTagSwitch (takeWhile isNotDelim . dropWhile (=='(') . show)+    where isNotDelim x = x /= ' ' && x /= ','  rsTagSwitch :: (Error e, Eq t) => (a -> t) -> [SpecCase e i o a] -> Spec e i o a rsTagSwitch tag cases = mkSpec rsParseDef rsGenDef@@ -235,6 +246,10 @@ rsCheckSet parser setfun rs = mkSpec rsParseDef rsGenDef     where rsGenDef rout a = rsGen rs (setfun rout) a           rsParseDef = parser >> rsParse rs++rsDefault :: Error e => (e -> a) -> Spec e u i a -> Spec e u i a+rsDefault onError (Spec gen parse) = Spec gen rsParseDef+    where rsParseDef = catchError parse (return . onError)  rsLift :: Error e => a -> Spec e i o a rsLift x = mkSpec (return x) const