Advertisement
fsimen

Untitled

Jun 1st, 2015
255
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. {-# LANGUAGE FlexibleInstances, TypeSynonymInstances #-}
  2. module JoinList where
  3. import Data.Monoid
  4. import Sized
  5. data JoinList m a = Empty
  6.                   | Single m a
  7.                   | Append m (JoinList m a) (JoinList m a)
  8.                   deriving (Eq, Show)
  9.      
  10.                                    
  11. tag :: Monoid m => JoinList m a -> m
  12. tag (Single m _) = m
  13. tag (Append m _ _) = m
  14.      
  15. (+++) :: Monoid m => JoinList m a -> JoinList m a -> JoinList m a
  16. (+++) Empty a = a
  17. (+++) a Empty = a
  18. -- (+++) elem1@(Single m1 _) elem2@(Single m2 _) =  Append (mappend (tag elem1) (tag elem2)) elem1 elem2
  19. (+++) elem1 elem2 =  Append (mappend (tag elem1) (tag elem2)) elem1 elem2
  20.  
  21.  
  22. indexJ :: (Sized b, Monoid b) => Int -> JoinList b a -> Maybe a
  23. indexJ _ Empty = Nothing
  24. indexJ n (Single m a) = Just a
  25. indexJ n root@(Append m left right)
  26.   | n > size_root = Nothing
  27.   | n > size_left = indexJ (n - size_left) right
  28.   | otherwise = indexJ n left
  29.   where size_left = getSize(size (tag left))
  30.         size_root = getSize(size (tag root))
  31.        
  32. dropJ :: (Sized b, Monoid b) => Int -> JoinList b a -> JoinList b a
  33. dropJ n Empty = Empty
  34. dropJ 1 (Single m a) = Empty
  35. dropJ n root@(Append m left right)
  36.   | n > size_root = Empty
  37.   | n > size_left =  dropJ (n - size_left) right
  38.   | otherwise = new_left +++ right
  39.   where  
  40.     size_left = getSize(size (tag left))
  41.     size_root = getSize(size (tag root))
  42.     new_left = dropJ n left
  43.                
  44. takeJ :: (Sized b, Monoid b) => Int -> JoinList b a -> JoinList b a
  45. takeJ n Empty = Empty
  46. takeJ 1 (Single m a) = Empty
  47. takeJ n root@(Append m left right)
  48.   | n > size_root = root
  49.   | n > size_left = left +++ new_right
  50.   | otherwise = Append m (dropJ n left) right
  51.   where size_left = getSize(size (tag left))
  52.         size_root = getSize(size (tag root))
  53.         new_right = takeJ (n - size_left) right
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement