katydid 0.3.0.1 → 0.3.1.0
raw patch · 3 files changed
+18/−12 lines, 3 filesdep +transformersdep −transformers-either
Dependencies added: transformers
Dependencies removed: transformers-either
Files
- katydid.cabal +2/−2
- src/MemDerive.hs +8/−5
- src/VpaDerive.hs +8/−5
katydid.cabal view
@@ -1,5 +1,5 @@ name: katydid-version: 0.3.0.1+version: 0.3.1.0 synopsis: A haskell implementation of Katydid description: A haskell implementation of Katydid@@ -66,7 +66,7 @@ , either , extra , ilist- , transformers-either+ , transformers default-language: Haskell2010 executable katydid-exe
src/MemDerive.hs view
@@ -13,7 +13,7 @@ import qualified Data.Map.Strict as M import Control.Monad.State (State, runState, lift, state)-import Control.Monad.Trans.Either (EitherT, runEitherT, left, hoistEither)+import Control.Monad.Trans.Except (ExceptT(..), runExceptT) import qualified Derive import Smart (Grammar, Pattern, lookupRef, nullable, lookupMain)@@ -49,11 +49,11 @@ returns g k = state $ \(Mem (c, r)) -> let (v', r') = mem (Derive.returns g) k r; in (v', Mem (c, r')) -mderive :: Tree t => Grammar -> [Pattern] -> [t] -> EitherT String (State Mem) [Pattern]+mderive :: Tree t => Grammar -> [Pattern] -> [t] -> ExceptT String (State Mem) [Pattern] mderive _ ps [] = return ps mderive g ps (tree:ts) = do { ifs <- lift $ calls g ps;- childps <- hoistEither $ evalIfExprs ifs (getLabel tree);+ childps <- hoistExcept $ evalIfExprs ifs (getLabel tree); (zchildps, zipper) <- return $ zippy childps; childres <- mderive g zchildps (getChildren tree); let @@ -64,12 +64,15 @@ mderive g rs ts } +hoistExcept :: (Monad m) => Either e a -> ExceptT e m a+hoistExcept = ExceptT . return+ -- | -- derive is the classic derivative implementation for trees. derive :: Tree t => Grammar -> [t] -> Either String Pattern derive g ts = let start = [lookupMain g]- (res, _) = runState (runEitherT $ mderive g start ts) newMem+ (res, _) = runState (runExceptT $ mderive g start ts) newMem in case res of (Left l) -> Left l (Right [r]) -> return r@@ -80,7 +83,7 @@ -- return whether tree is valid, given the input grammar and start pattern. validate :: Tree t => Grammar -> Pattern -> [t] -> (State Mem) Bool validate g start tree = do {- rs <- runEitherT (mderive g [start] tree);+ rs <- runExceptT (mderive g [start] tree); return $ case rs of (Right [r]) -> nullable r _ -> False
src/VpaDerive.hs view
@@ -12,7 +12,7 @@ import qualified Data.Map.Strict as M import Control.Monad.State (State, runState, state, lift) import Data.Foldable (foldlM)-import Control.Monad.Trans.Either (EitherT, runEitherT, left, hoistEither)+import Control.Monad.Trans.Except (ExceptT(..), runExceptT) import qualified Derive import Smart (Grammar, Pattern)@@ -48,16 +48,19 @@ calls key = state $ \(Vpa (n, c, r, g)) -> let (v', c') = mem (zipIfExprs . Derive.calls g) key c; in (v', Vpa (n, c', r, g)) -vpacall :: VpaState -> Label -> EitherT String (State Vpa) (StackElm, VpaState)+vpacall :: VpaState -> Label -> ExceptT String (State Vpa) (StackElm, VpaState) vpacall vpastate label = do { zifexprs <- lift $ calls vpastate;- (nextstate, zipper) <- hoistEither $ evalZippedIfExprs zifexprs label;+ (nextstate, zipper) <- hoistExcept $ evalZippedIfExprs zifexprs label; let stackelm = (vpastate, zipper) ; return (stackelm, nextstate) } +hoistExcept :: (Monad m) => Either e a -> ExceptT e m a+hoistExcept = ExceptT . return+ returns :: ([Pattern], Zipper, [Bool]) -> State Vpa [Pattern] returns key = state $ \(Vpa (n, c, r, g)) -> let (v', r') = mem (\(ps, zipper, znulls) -> @@ -70,7 +73,7 @@ returns (vpastate, zipper, zipnulls) } -deriv :: Tree t => VpaState -> t -> EitherT String (State Vpa) VpaState+deriv :: Tree t => VpaState -> t -> ExceptT String (State Vpa) VpaState deriv current tree = do { (stackelm, nextstate) <- vpacall current (getLabel tree); resstate <- foldlM deriv nextstate (getChildren tree);@@ -80,7 +83,7 @@ foldLT :: Tree t => Vpa -> VpaState -> [t] -> Either String [Pattern] foldLT _ current [] = return current foldLT m current (t:ts) = - let (newstate, newm) = runState (runEitherT $ deriv current t) m+ let (newstate, newm) = runState (runExceptT $ deriv current t) m in case newstate of (Left l) -> Left l (Right r) -> foldLT newm r ts