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 +3/−3
- src/Data/BidiSpec.hs +26/−11
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