Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
kobenate :: (MonadVoretion m)
=> Config
-> Disjunct
-> RuleZipper
-> m Disjunct
kobenate cfg d₀ z = uphill d₀ z
where
climb t x =
case parent x of
Just x' -> uphill t x'
Nothing -> return t
uphill t x =
case label <$> parent x of
Just (LinkAnd{}) -> do
i <- downhill' cfg $ reverse $ before x
j <- downhill' cfg $ after x
climb (i \++/ t \++/ j) x
_ ->
case label x of
MultiConnector{} -> do
m <- downhill cfg (tree x)
let t' = t \++/ m
climb t' x
_ ->
climb t x
downhill' :: (MonadVoretion m)
=> Config
-> [Link]
-> m Disjunct
downhill' cfg x = foldl (\++/) ([], []) <$> mapM (downhill cfg) x
downhill :: (MonadVoretion m)
=> Config
-> Link
-> m Disjunct
downhill cfg <a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="1b772b5b">[email protected]</a>(Node label subforest) =
case label of
Optional _ ->
ifR (_decay_optional cfg)
{-then-} (downhill cfg $ head subforest)
{-else-} (return ([], []))
MultiConnector _ ->
ifR (_decay_multi cfg)
{-then-} (do
a <- downhill cfg l0
b <- downhill cfg $ head subforest
return $ a \++/ b)
{-else-} (return ([], []))
LinkOr{} ->
downhill cfg =<< pickRandom subforest
LinkAnd{} ->
downhill' cfg subforest
Cost{} ->
downhill' cfg subforest
EmptyLink ->
return ([], [])
Link{_link=i} -> do
case _linkDirection i of
Plus -> return ([], [Left i])
Minus -> return ([Left i], [])
Метод вореции дерева методом вниз, вверх и опять вниз, но сбоку. В индексе храним смещение бата правил, зожатых в отдельный файл. Ворециируем любое подходящее правило из индекса и розжимаем дерево в зиппер. Находим пачку подходящих зипперов, см. http://govnokod.ru/20195, ворециируем любой из них. Вверх идём просто, ничего не ворецируя, ибо нужную кобенацию важно сохранить, а вот сбоку идём вниз, тут уж можно любую кобенацию брать.
ла-ла-ла-ла-ла
ПАДНАСРЁМ
ла-ла-ла-ла-ла