Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Just v сообщение идёт дальше по цепочке, при возврате Nothing цепочка прерывается. А route нужен, чтобы ответвить сообщение в другую цепочку.module Event (
) where
import Prelude hiding (id, (.))
import Control.Category
data Node a b = Node (a -> IO (Maybe b))
instance Category Node where
id = Node $ return . Just
(Node g) . (Node f) = Node $ \v -> do
f v >>= maybe (return Nothing) g
endnode :: (a -> IO ()) -> Node a ()
node :: (a -> IO ()) -> Node a a
run :: Node a b -> a -> IO (Maybe b)
run_ :: Node a b -> a -> IO ()
endnode f = Node $ \v -> f v >> return Nothing
node f = Node $ \v -> f v >> return (Just v)
run (Node f) v = f v
run_ (Node f) v = f v >> return ()
server = endnode putStrLn
route to = node $ run_ to
forward to = node $ run_ to
network to = node $ run_ to
test = run test' "correct" where
logmsg = node $ \s -> putStrLn ("log: " ++ s)
test' = logmsg >>> test'' >>> server
test'' = route (network fw2) where
fw2 = forward fw1
fw1 = forward serv
serv = server
public bool Print()
{
IContentView view = this.Workspace as IContentView;
return view != null ? view.Print() : false;
}
public bool Print()
{
bool result = false;
// Printing code...
return result;
}
Паттерн проектирования «Цепочка обязанностей» / «Chain of Responsibility»