packages feed

control-monad-queue-0.0.9: tests/BreadthFirstSearch.hs

{-# OPTIONS_GHC -O2 -fasm              #-}
{-# LANGUAGE BangPatterns              #-}
{-# LANGUAGE NoMonomorphismRestriction #-}
module BreadthFirstSearch where

import BinaryTree
import qualified Control.Monad.Queue.Allison  as A
import qualified Control.Monad.Queue.Corec    as C
import qualified Control.Monad.Queue.ST       as STQ
import qualified CpSt
import qualified SideChannelQ                 as SCQ
import qualified Data.Queue.TwoStack          as Two
import qualified Data.Queue.Okasaki           as Oka
import Data.Sequence
import qualified Data.Sequence as Seq

isBranch = labelDisj (const False) (const True)

direct ::  Tree a b  ->  [Tree a b]
direct     tree      =   queue
  where
    queue  | isBranch tree   = tree :  explore 1 queue
           | otherwise       =         explore 0 queue

    explore :: Int -> [Tree a b] -> [Tree a b]
    explore  0 _ = []
    explore  (n+1) (Branch _ l r : head')
      =  if (isBranch  l)
         then   if (isBranch r)
                then   l :  r :  explore  (  n+2)  head'
                else   l :       explore  (  n+1)  head'
         else   if (isBranch r)
                then        r :  explore  (  n+1)  head'
                else             explore     n     head'

allison tree = A.runQueue (handle tree >> explore)
  where
    handle t@(Leaf   _      ) = return ()
    handle t@(Branch _ _ _  ) = A.enQ t

    explore = do
      branch <- A.deQ
      case branch of
        Nothing -> return ()
        (Just (Branch _ !l !r)) -> handle l >> handle r >> explore


allison2  tree = A.runQueue (handle tree >> explore)
  where
    handle t@(Leaf   _      ) = return ()
    handle t@(Branch _ _ _  ) = A.enQ t

    explore = do
      (Branch _ !l !r) <- A.deQ_break
      handle l
      handle r
      explore


stq tree = STQ.runResult (handle tree >> explore)
  where
    handle t@(Leaf   _      ) = return ()
    handle t@(Branch _ _ _  ) = STQ.enQ t

    explore = do
      branch <- STQ.deQ
      case branch of
        Nothing -> return ()
        (Just (Branch _ !l !r)) -> handle l >> handle r >> explore

corec1   tree = case C.runResultQueue (handle tree >> explore) of
                 (_,q) -> q
  where

    handle t@(Leaf   _      ) = return ()
    handle t@(Branch _ _ _  ) = C.enQ t

    explore = do
      branch <- C.deQ
      case branch of
        Nothing -> return ()
        (Just (Branch _ !l !r)) -> handle l >> handle r >> explore



corec2   tree = case C.runResultQueue (handle tree >> explore) of
                  ((),q) -> q
  where
    handle t@(Leaf   _      ) = return ()
    handle t@(Branch _ _ _  ) = C.enQ t

    explore = do
      branch <- C.deQ
      case branch of
        Nothing -> return ()
        (Just (Branch _ !l !r)) -> handle l >> handle r >> explore

sidechan1 tree
    = case SCQ.runResultQueue (handle tree >> explore) of
        (_,q) -> q
  where
    handle t@(Leaf   _      ) = return ()
    handle t@(Branch _ _ _  ) = SCQ.enQ t

    explore = do
      branch <- SCQ.deQ
      case branch of
        Nothing -> return ()
        (Just (Branch _ !l !r)) -> handle l >> handle r >> explore



sidechan2 tree
    = case SCQ.runResultQueue (handle tree >> explore) of
       ((),q) -> q
  where
    handle t@(Leaf   _      ) = return ()
    handle t@(Branch _ _ _  ) = SCQ.enQ t

    explore = do
      branch <- SCQ.deQ
      case branch of
        Nothing -> return ()
        (Just (Branch _ !l !r)) -> handle l >> handle r >> explore



twostack t = loop (handle t Two.empty)
  where
    handle t@(Leaf   _    ) q = q
    handle t@(Branch _ _ _) q = Two.enque t q

    loop q = case Two.deque q of
               (Nothing, q') ->  ()
               (Just (Branch _ !l !r), q') -> loop (handle r (handle l q'))


twostack_cpst tree = CpSt.runResult (handle tree >> explore)
  where
    handle t@(Leaf   _      ) = return ()
    handle t@(Branch _ _ _  ) = CpSt.enQ t

    explore = do
      branch <- CpSt.deQ
      case branch of
        Nothing -> return ()
        (Just (Branch _ !l !r)) -> handle l >> handle r >> explore


twostack_list t = loop (handle t Two.empty)
  where
    handle t@(Leaf   _    ) q = q
    handle t@(Branch _ _ _) q = Two.enque t q

    loop q = case Two.deque q of
               (Nothing, q') ->  []
               (Just t@(Branch _ !l !r), q') -> t : loop (handle r (handle l q'))

okasaki t = loop (handle t Oka.empty)
  where
    handle t@(Leaf   _    ) q = q
    handle t@(Branch _ _ _) q = Oka.enque t q

    loop q = case Oka.deque q of
               (Nothing, q') ->  ()
               (Just (Branch _ !l !r), q') -> loop (handle r (handle l q'))


okasaki_list t = loop (handle t Oka.empty)
  where
    handle t@(Leaf   _    ) q = q
    handle t@(Branch _ _ _) q = Oka.enque t q

    loop q = case Oka.deque q of
               (Nothing, q') ->  []
               (Just t@(Branch _ !l !r), q') -> t:loop (handle r (handle l q'))

sequence t = loop (handle t empty)
  where
    handle t@(Leaf   _    ) q = q
    handle t@(Branch _ _ _) q = q |> t

    loop q = case viewl q of
               EmptyL -> ()
               (Branch _ !l !r) :< q' -> loop (handle r (handle l q'))

sequence_list t = loop (handle t empty)
  where
    handle t@(Leaf   _    ) q = q
    handle t@(Branch _ _ _) q = q |> t

    loop q = case viewl q of
               EmptyL -> []
               t@(Branch _ !l !r) :< q' -> t:loop (handle r (handle l q'))

sequence2 t = loop (Seq.singleton t)
   where
   handle t@(Leaf   _     ) q = q
   handle t@(Branch _ _ _ ) q = q |> t

   loop q | Seq.null q = ()
          | otherwise  = case Seq.index q 0 of
                           x@(Branch _ l r) -> loop (handle r (handle l (Seq.drop 1 q)))