forked from GitHub/gf-core
refactor GF.Data.BacktrackM to use the MonadState and Functor classes
This commit is contained in:
@@ -261,7 +261,7 @@ evalTerm cnc_defs path x = error ("evalTerm ("++show x++")")
|
|||||||
|
|
||||||
unifyPType :: FIndex -> FPath -> Term -> CnvMonad FIndex
|
unifyPType :: FIndex -> FPath -> Term -> CnvMonad FIndex
|
||||||
unifyPType nr path (C max_index) =
|
unifyPType nr path (C max_index) =
|
||||||
do (_, args, _, _) <- readState
|
do (_, args, _, _) <- get
|
||||||
let (PFCat _ _ tcs,_) = args !! nr
|
let (PFCat _ _ tcs,_) = args !! nr
|
||||||
case lookup path tcs of
|
case lookup path tcs of
|
||||||
Just index -> return index
|
Just index -> return index
|
||||||
@@ -390,7 +390,7 @@ genFCatArg cnc_defs ctype env@(GrammarEnv last_id catSet seqSet funSet prodSet)
|
|||||||
gen_tcs (C max_index) path acc =
|
gen_tcs (C max_index) path acc =
|
||||||
case List.lookup path tcs of
|
case List.lookup path tcs of
|
||||||
Just index -> return $! addConstraint path index acc
|
Just index -> return $! addConstraint path index acc
|
||||||
Nothing -> do writeState True
|
Nothing -> do put True
|
||||||
index <- member [0..max_index]
|
index <- member [0..max_index]
|
||||||
return $! addConstraint path index acc
|
return $! addConstraint path index acc
|
||||||
where
|
where
|
||||||
@@ -498,21 +498,21 @@ mkSelector rcs tcss =
|
|||||||
-- updating the MCF rule
|
-- updating the MCF rule
|
||||||
|
|
||||||
readArgCType :: FIndex -> CnvMonad Term
|
readArgCType :: FIndex -> CnvMonad Term
|
||||||
readArgCType nr = do (_, _, _, ctypes) <- readState
|
readArgCType nr = do (_, _, _, ctypes) <- get
|
||||||
return (ctypes !! nr)
|
return (ctypes !! nr)
|
||||||
|
|
||||||
restrictArg :: FIndex -> FPath -> FIndex -> CnvMonad ()
|
restrictArg :: FIndex -> FPath -> FIndex -> CnvMonad ()
|
||||||
restrictArg nr path index = do
|
restrictArg nr path index = do
|
||||||
(head, args, ctype, ctypes) <- readState
|
(head, args, ctype, ctypes) <- get
|
||||||
args' <- updateNthM (\(xcat,xs) -> do xcat <- restrictProtoFCat path index xcat
|
args' <- updateNthM (\(xcat,xs) -> do xcat <- restrictProtoFCat path index xcat
|
||||||
return (xcat,xs) ) nr args
|
return (xcat,xs) ) nr args
|
||||||
writeState (head, args', ctype, ctypes)
|
put (head, args', ctype, ctypes)
|
||||||
|
|
||||||
projectArg :: FIndex -> FPath -> CnvMonad Int
|
projectArg :: FIndex -> FPath -> CnvMonad Int
|
||||||
projectArg nr path = do
|
projectArg nr path = do
|
||||||
(head, args, ctype, ctypes) <- readState
|
(head, args, ctype, ctypes) <- get
|
||||||
(xnr,args') <- updateArgs nr args
|
(xnr,args') <- updateArgs nr args
|
||||||
writeState (head, args', ctype, ctypes)
|
put (head, args', ctype, ctypes)
|
||||||
return xnr
|
return xnr
|
||||||
where
|
where
|
||||||
updateArgs :: FIndex -> [(ProtoFCat,[FPath])] -> CnvMonad (Int,[(ProtoFCat,[FPath])])
|
updateArgs :: FIndex -> [(ProtoFCat,[FPath])] -> CnvMonad (Int,[(ProtoFCat,[FPath])])
|
||||||
@@ -525,20 +525,20 @@ projectArg nr path = do
|
|||||||
return (xnr,a:as)
|
return (xnr,a:as)
|
||||||
|
|
||||||
readHeadCType :: CnvMonad Term
|
readHeadCType :: CnvMonad Term
|
||||||
readHeadCType = do (_, _, ctype, _) <- readState
|
readHeadCType = do (_, _, ctype, _) <- get
|
||||||
return ctype
|
return ctype
|
||||||
|
|
||||||
restrictHead :: FPath -> FIndex -> CnvMonad ()
|
restrictHead :: FPath -> FIndex -> CnvMonad ()
|
||||||
restrictHead path term
|
restrictHead path term
|
||||||
= do (head, args, ctype, ctypes) <- readState
|
= do (head, args, ctype, ctypes) <- get
|
||||||
head' <- restrictProtoFCat path term head
|
head' <- restrictProtoFCat path term head
|
||||||
writeState (head', args, ctype, ctypes)
|
put (head', args, ctype, ctypes)
|
||||||
|
|
||||||
projectHead :: FPath -> CnvMonad ()
|
projectHead :: FPath -> CnvMonad ()
|
||||||
projectHead path
|
projectHead path
|
||||||
= do (head, args, ctype, ctypes) <- readState
|
= do (head, args, ctype, ctypes) <- get
|
||||||
head' <- projectProtoFCat path head
|
head' <- projectProtoFCat path head
|
||||||
writeState (head', args, ctype, ctypes)
|
put (head', args, ctype, ctypes)
|
||||||
|
|
||||||
restrictProtoFCat :: FPath -> FIndex -> ProtoFCat -> CnvMonad ProtoFCat
|
restrictProtoFCat :: FPath -> FIndex -> ProtoFCat -> CnvMonad ProtoFCat
|
||||||
restrictProtoFCat path0 index0 (PFCat cat rcs tcs) = do
|
restrictProtoFCat path0 index0 (PFCat cat rcs tcs) = do
|
||||||
|
|||||||
@@ -160,7 +160,7 @@ convertArg (C max) nr path lbl_path lin lins = do
|
|||||||
restrictArg nr path index
|
restrictArg nr path index
|
||||||
return lins
|
return lins
|
||||||
convertArg (S _) nr path lbl_path lin lins = do
|
convertArg (S _) nr path lbl_path lin lins = do
|
||||||
(_, args) <- readState
|
(_, args) <- get
|
||||||
let PFCat _ cat rcs tcs = args !! nr
|
let PFCat _ cat rcs tcs = args !! nr
|
||||||
l = index path rcs 0
|
l = index path rcs 0
|
||||||
sym | isLiteralCat cat = FSymLit nr l
|
sym | isLiteralCat cat = FSymLit nr l
|
||||||
@@ -190,7 +190,7 @@ convertRec cnc_defs (index:sub_sel) ctype record lbl_path lin lins = do
|
|||||||
-- eval a term to ground terms
|
-- eval a term to ground terms
|
||||||
|
|
||||||
evalTerm :: TermMap -> FPath -> Term -> CnvMonad FIndex
|
evalTerm :: TermMap -> FPath -> Term -> CnvMonad FIndex
|
||||||
evalTerm cnc_defs path (V nr) = do (_, args) <- readState
|
evalTerm cnc_defs path (V nr) = do (_, args) <- get
|
||||||
let PFCat _ _ _ tcs = args !! nr
|
let PFCat _ _ _ tcs = args !! nr
|
||||||
rpath = reverse path
|
rpath = reverse path
|
||||||
index <- member (fromMaybe (error "evalTerm: wrong path") (lookup rpath tcs))
|
index <- member (fromMaybe (error "evalTerm: wrong path") (lookup rpath tcs))
|
||||||
@@ -349,15 +349,15 @@ getFCats (GrammarEnv last_id catSet seqSet funSet crcSet prodSet) (PFCat n cat r
|
|||||||
|
|
||||||
restrictArg :: FIndex -> FPath -> FIndex -> CnvMonad ()
|
restrictArg :: FIndex -> FPath -> FIndex -> CnvMonad ()
|
||||||
restrictArg nr path index = do
|
restrictArg nr path index = do
|
||||||
(head, args) <- readState
|
(head, args) <- get
|
||||||
args' <- updateNthM (restrictProtoFCat path index) nr args
|
args' <- updateNthM (restrictProtoFCat path index) nr args
|
||||||
writeState (head, args')
|
put (head, args')
|
||||||
|
|
||||||
restrictHead :: FPath -> FIndex -> CnvMonad ()
|
restrictHead :: FPath -> FIndex -> CnvMonad ()
|
||||||
restrictHead path term
|
restrictHead path term
|
||||||
= do (head, args) <- readState
|
= do (head, args) <- get
|
||||||
head' <- restrictProtoFCat path term head
|
head' <- restrictProtoFCat path term head
|
||||||
writeState (head', args)
|
put (head', args)
|
||||||
|
|
||||||
restrictProtoFCat :: FPath -> FIndex -> ProtoFCat -> CnvMonad ProtoFCat
|
restrictProtoFCat :: FPath -> FIndex -> ProtoFCat -> CnvMonad ProtoFCat
|
||||||
restrictProtoFCat path0 index0 (PFCat n cat rcs tcs) = do
|
restrictProtoFCat path0 index0 (PFCat n cat rcs tcs) = do
|
||||||
|
|||||||
@@ -13,24 +13,24 @@
|
|||||||
-----------------------------------------------------------------------------
|
-----------------------------------------------------------------------------
|
||||||
|
|
||||||
{-# OPTIONS_GHC -fglasgow-exts #-}
|
{-# OPTIONS_GHC -fglasgow-exts #-}
|
||||||
module GF.Data.BacktrackM ( -- * the backtracking state monad
|
module GF.Data.BacktrackM (
|
||||||
|
-- * the backtracking state monad
|
||||||
BacktrackM,
|
BacktrackM,
|
||||||
-- * controlling the monad
|
|
||||||
failure,
|
|
||||||
(|||),
|
|
||||||
-- * handling the state & environment
|
|
||||||
readState,
|
|
||||||
writeState,
|
|
||||||
-- * monad specific utilities
|
-- * monad specific utilities
|
||||||
member,
|
member,
|
||||||
|
cut,
|
||||||
-- * running the monad
|
-- * running the monad
|
||||||
foldBM, runBM,
|
foldBM, runBM,
|
||||||
foldSolutions, solutions,
|
foldSolutions, solutions,
|
||||||
foldFinalStates, finalStates
|
foldFinalStates, finalStates,
|
||||||
|
|
||||||
|
-- * reexport the 'MonadState' class
|
||||||
|
module Control.Monad.State.Class,
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Data.List
|
import Data.List
|
||||||
import Control.Monad
|
import Control.Monad
|
||||||
|
import Control.Monad.State.Class
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
-- Combining endomorphisms and continuations
|
-- Combining endomorphisms and continuations
|
||||||
@@ -60,34 +60,27 @@ foldFinalStates f b (BM m) s = m (\x s b -> f s b) s b
|
|||||||
finalStates :: BacktrackM s () -> s -> [s]
|
finalStates :: BacktrackM s () -> s -> [s]
|
||||||
finalStates bm = map fst . runBM bm
|
finalStates bm = map fst . runBM bm
|
||||||
|
|
||||||
|
|
||||||
-- * handling the state & environment
|
|
||||||
|
|
||||||
readState :: BacktrackM s s
|
|
||||||
readState = BM (\c s b -> c s s b)
|
|
||||||
|
|
||||||
writeState :: s -> BacktrackM s ()
|
|
||||||
writeState s = BM (\c _ b -> c () s b)
|
|
||||||
|
|
||||||
instance Monad (BacktrackM s) where
|
instance Monad (BacktrackM s) where
|
||||||
return a = BM (\c s b -> c a s b)
|
return a = BM (\c s b -> c a s b)
|
||||||
BM m >>= k = BM (\c s b -> m (\a s b -> unBM (k a) c s b) s b)
|
BM m >>= k = BM (\c s b -> m (\a s b -> unBM (k a) c s b) s b)
|
||||||
where unBM (BM m) = m
|
where unBM (BM m) = m
|
||||||
fail _ = failure
|
fail _ = mzero
|
||||||
|
|
||||||
-- * controlling the monad
|
instance Functor (BacktrackM s) where
|
||||||
|
fmap f (BM m) = BM (\c s b -> m (\a s b -> c (f a) s b) s b)
|
||||||
failure :: BacktrackM s a
|
|
||||||
failure = BM (\c s b -> b)
|
|
||||||
|
|
||||||
(|||) :: BacktrackM s a -> BacktrackM s a -> BacktrackM s a
|
|
||||||
(BM f) ||| (BM g) = BM (\c s b -> g c s $! f c s b)
|
|
||||||
|
|
||||||
instance MonadPlus (BacktrackM s) where
|
instance MonadPlus (BacktrackM s) where
|
||||||
mzero = failure
|
mzero = BM (\c s b -> b)
|
||||||
mplus = (|||)
|
(BM f) `mplus` (BM g) = BM (\c s b -> g c s $! f c s b)
|
||||||
|
|
||||||
|
instance MonadState s (BacktrackM s) where
|
||||||
|
get = BM (\c s b -> c s s b)
|
||||||
|
put s = BM (\c _ b -> c () s b)
|
||||||
|
|
||||||
-- * specific functions on the backtracking monad
|
-- * specific functions on the backtracking monad
|
||||||
|
|
||||||
member :: [a] -> BacktrackM s a
|
member :: [a] -> BacktrackM s a
|
||||||
member xs = BM (\c s b -> foldl' (\b x -> c x s b) b xs)
|
member xs = BM (\c s b -> foldl' (\b x -> c x s b) b xs)
|
||||||
|
|
||||||
|
cut :: BacktrackM s a -> BacktrackM s [(s,a)]
|
||||||
|
cut f = BM (\c s b -> c (runBM f s) s b)
|
||||||
|
|||||||
Reference in New Issue
Block a user