Skip to content
Snippets Groups Projects
Commit e0cc21e2 authored by chrg's avatar chrg
Browse files

Improve the code

parent 4bd2472b
No related branches found
No related tags found
No related merge requests found
...@@ -114,7 +114,7 @@ run = do ...@@ -114,7 +114,7 @@ run = do
unless t do unless t do
liftIO exitFailure liftIO exitFailure
l <- runMaybeT (reduceFast (check file) (Map.singleton (C.internalIdent "main") True) (reduceC c)) l <- runMaybeT (reduceIO (check file) (Map.singleton (C.internalIdent "main") True) (reduceC c))
case l of case l of
Just l' -> do Just l' -> do
......
...@@ -82,10 +82,8 @@ reduce p = checkgo ...@@ -82,10 +82,8 @@ reduce p = checkgo
where where
go = \case go = \case
(Done i) -> pure i (Done i) -> pure i
(Split lhs rhs) -> (Split lhs rhs) -> (checkgo lhs <|> go rhs)
(checkgo lhs Control.Applicative.<|> go rhs) (SplitOn _ lhs rhs) -> (checkgo lhs <|> go rhs)
(SplitOn _ lhs rhs) ->
(checkgo lhs Control.Applicative.<|> go rhs)
checkgo rt = p (extract rt) *> go rt checkgo rt = p (extract rt) *> go rt
{-# SPECIALIZE reduce :: (i -> MaybeT IO ()) -> RTree l i -> MaybeT IO i #-} {-# SPECIALIZE reduce :: (i -> MaybeT IO ()) -> RTree l i -> MaybeT IO i #-}
...@@ -120,11 +118,14 @@ reduceL p = checkgo ...@@ -120,11 +118,14 @@ reduceL p = checkgo
data ReState l = ReState ![Bool] !(Valuation l) data ReState l = ReState ![Bool] !(Valuation l)
newtype ReReduce l i = ReReduce {runReReduce :: IORef (ReState l) -> IO i} {- | A faster version of the RTree which simply reruns the reducer program instead
of building a tree.
-}
newtype IORTree l i = IORTree {runIORTree :: IORef (ReState l) -> IO i}
deriving (Functor, Applicative, Monad) via (ReaderT (IORef (ReState l)) IO) deriving (Functor, Applicative, Monad) via (ReaderT (IORef (ReState l)) IO)
instance (Ord l) => MonadReduce l (ReReduce l) where instance (Ord l) => MonadReduce l (IORTree l) where
split ml r1 r2 = ReReduce \ref -> do split ml r1 r2 = IORTree \ref -> do
test <- case ml of test <- case ml of
Nothing -> do Nothing -> do
atomicModifyIORef' atomicModifyIORef'
...@@ -142,17 +143,17 @@ instance (Ord l) => MonadReduce l (ReReduce l) where ...@@ -142,17 +143,17 @@ instance (Ord l) => MonadReduce l (ReReduce l) where
ReState [] v -> (ReState [] (Map.insert l True v), False) ReState [] v -> (ReState [] (Map.insert l True v), False)
) )
if test if test
then runReReduce r1 ref then runIORTree r1 ref
else runReReduce r2 ref else runIORTree r2 ref
reduceFast reduceIO
:: forall m l i :: forall m l i
. (MonadIO m, Ord l) . (MonadIO m, Ord l)
=> (Valuation l -> i -> MaybeT m ()) => (Valuation l -> i -> MaybeT m ())
-> Valuation l -> Valuation l
-> ReReduce l i -> IORTree l i
-> MaybeT m i -> MaybeT m i
reduceFast p v (ReReduce ext) = MaybeT $ go [] reduceIO p v (IORTree ext) = MaybeT $ go []
where where
go pth = do go pth = do
ref <- liftIO $ newIORef (ReState pth v) ref <- liftIO $ newIORef (ReState pth v)
...@@ -169,7 +170,7 @@ reduceFast p v (ReReduce ext) = MaybeT $ go [] ...@@ -169,7 +170,7 @@ reduceFast p v (ReReduce ext) = MaybeT $ go []
pure Nothing pure Nothing
| otherwise -> | otherwise ->
pure (Just i) pure (Just i)
{-# INLINE reduceFast #-} {-# INLINE reduceIO #-}
-- Combinators -- Combinators
...@@ -194,85 +195,6 @@ collectNonEmpty fn as = do ...@@ -194,85 +195,6 @@ collectNonEmpty fn as = do
MaybeT . pure $ NE.nonEmpty as' MaybeT . pure $ NE.nonEmpty as'
{-# INLINE collectNonEmpty #-} {-# INLINE collectNonEmpty #-}
-- newtype LTree l i = LTree {runLTree :: Valuation l -> Maybe (RTree l i)}
-- deriving (Functor)
--
-- instance Applicative (LTree l) where
-- pure i = LTree{runLTree = \_ -> Just $ Done i}
-- (<*>) = ap
--
-- instance Monad (LTree l) where
-- LTree ma >>= f = LTree \l ->
-- case ma l of
-- Done i -> f i
-- Split l lhs rhs ->
-- extract' :: RTree l i -> i
-- extract' = \case
-- RTree' (Split _ _ v) -> extract' v
-- Done v -> v
--
-- instance Functor (RTree l) where
-- fmap f (Done i) = Done (f i)
-- fmap f (RTree' r) = RTree' (fmap (fmap f) r)
--
--
-- instance MonadFree (RTreeF l) (RTree' l) where
-- wrap = RTree'
-- {-# INLINE wrap #-}
-- | Reduce an input using a monad.
-- newtype I l i = I ([(l, Bool)] -> RTreeI l i)
--
-- data RTreeI l i
-- = RTreeI (RTreeF l (I l i))
-- | DoneI !i
-- -- This is not a great defintions, as the i does not depend on
-- -- the current i, but instead on the final I.
-- data RTreeIO j i = RTreeIO ((j -> IO Bool) -> IO i) j
--
-- extractIO :: RTreeIO j i -> j
-- extractIO (RTreeIO _ i) = i
-- instance Functor (RTreeIO j) where
-- fmap f (RTreeIO mf i) = RTreeIO (\h -> f <$> mf (h . f)) (f i)
--
-- instance Applicative (RTreeIO j) where
-- pure i = RTreeIO (\_ -> pure i) i
-- (<*>) = ap
--
-- -- RTreeIO f fi <*> RTreeIO a ai = RTreeIO (f <*> a) (fi ai)
--
-- instance Monad (RTreeIO j) where
-- RTreeIO (ma :: ((a -> IO Bool) -> IO a)) a >>= (f :: (a -> RTreeIO b)) =
-- RTreeIO undefined (extractIO $ f a)
--
-- instance MonadFree (RTreeF Void) (RTreeIO j) where
-- wrap (Split Nothing (RTreeIO lhs le) (RTreeIO rhs re)) =
-- RTreeIO
-- ( \p ->
-- p le >>= \case
-- True -> lhs p
-- False -> rhs p
-- )
-- re
-- wrap (Split (Just x) _ _) = absurd x
-- reduceIO
-- :: forall i
-- . (i -> IO Bool)
-- -> RTreeIO j i
-- -> IO (Maybe i)
-- reduceIO p (RTreeIO rt i) = runMaybeT do
-- let (mi, i') = foldR go $ fmap (\i -> (pure i, i)) t
-- p i' *> mi
-- where
-- go :: RTreeF l (IO i, i) -> (IO i, i)
-- go (Split _ (lhs, le) (rhs, re)) =
-- ((p le *> lhs) <|> rhs, re)
-- | Split the world on a fact. False it does not happen, and True it does happen. -- | Split the world on a fact. False it does not happen, and True it does happen.
given :: RTree Void Bool given :: RTree Void Bool
given = pure False <| pure True given = pure False <| pure True
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment