packages feed

pred-trie 0.0.5 → 0.0.6

raw patch · 5 files changed

+76/−18 lines, 5 files

Files

pred-trie.cabal view
@@ -1,5 +1,5 @@ Name:                   pred-trie-Version:                0.0.5+Version:                0.0.6 Author:                 Athan Clark <athan.clark@gmail.com> Maintainer:             Athan Clark <athan.clark@gmail.com> License:                BSD3
src/Data/Trie/Pred/Disjoint.hs view
@@ -30,3 +30,17 @@     getFirst [] = Nothing     getFirst (Nothing:xs) = getFirst xs     getFirst (Just x :xs) = Just x+++litSingleton :: [t] -> x -> RDPTrie p t x+litSingleton [] x = Rooted (Just x) []+litSingleton ts x = Rooted Nothing [ND.litSingletonTail (NE.fromList ts) x]+++litExtrude :: [t] -> RDPTrie p t x -> RDPTrie p t x+litExtrude [] r = r+litExtrude (t:[]) (Rooted mx xs) = Rooted Nothing [DMore t mx xs]+litExtrude ts (Rooted mx xs) = Rooted Nothing [ND.litExtrudeTail (init ts) $+                                                 DMore (last ts) mx xs+                                              ]+
src/Data/Trie/Pred/Disjoint/Tail.hs view
@@ -7,6 +7,9 @@   , lookup   , merge   , areDisjoint+  , litSingletonTail+  , litExtrudeTail+  , sort   ) where  import Prelude hiding (lookup)@@ -69,7 +72,12 @@ getFirst (Just x :xs) = Just x  -buildLitSingletonTail :: NonEmpty t -> x -> DPTrie p t x-buildLitSingletonTail (t:|[]) x = DMore t (Just x) []-buildLitSingletonTail (t:|ts) x = DMore t Nothing  [buildLitSingletonTail (NE.fromList ts) x]+litSingletonTail :: NonEmpty t -> x -> DPTrie p t x+litSingletonTail (t:|[]) x = DMore t (Just x) []+litSingletonTail (t:|ts) x = DMore t Nothing  [litSingletonTail (NE.fromList ts) x]+++litExtrudeTail :: [t] -> DPTrie p t x -> DPTrie p t x+litExtrudeTail [] r = r+litExtrudeTail (t:ts) r = DMore t Nothing [litExtrudeTail ts r] 
src/Data/Trie/Pred/Unified.hs view
@@ -29,3 +29,16 @@     getFirst [] = Nothing     getFirst (Nothing:xs) = getFirst xs     getFirst (Just x :xs) = Just x+++litSingleton :: [t] -> x -> RUPTrie t x+litSingleton [] x = Rooted (Just x) []+litSingleton ts x = Rooted Nothing [NU.litSingletonTail (NE.fromList ts) x]+++litExtrude :: [t] -> RUPTrie t x -> RUPTrie t x+litExtrude [] r = r+litExtrude (t:[]) (Rooted mx xs) = Rooted Nothing [UMore t mx xs]+litExtrude ts (Rooted mx xs) = Rooted Nothing [NU.litExtrudeTail (init ts) $+                                                 UMore (last ts) mx xs+                                              ]
src/Data/Trie/Pred/Unified/Tail.hs view
@@ -7,11 +7,14 @@   , lookup   , merge   , areDisjoint+  , litSingletonTail+  , litExtrudeTail+  , sort   ) where  import Prelude hiding (lookup)-import Data.List.NonEmpty hiding (map)-import Data.List.NonEmpty as NE hiding (map)+import Data.List.NonEmpty hiding (map, sort)+import Data.List.NonEmpty as NE hiding (map, sort)   @@ -30,21 +33,16 @@ -- | Overwrites when similar, leaves untouched when not merge :: (Eq t) => UPTrie t x -> UPTrie t x -> UPTrie t x merge xx@(UMore t mx xs) yy@(UMore p my ys)-  | t == p = UMore p my $ foldr go [] $ xs ++ ys+  | t == p = UMore p my $ sort $ xs ++ ys   | otherwise = xx-  where-    go :: (Eq t) => UPTrie t x -> [UPTrie t x] -> [UPTrie t x]-    go a [] = [a]-    go a (b:bs) | areDisjoint a b =       a : b : bs-                | otherwise       = (merge a b) : bs merge xx@(UPred t q mrx xrs) yy@(UPred p w mry yrs)-  | t == p = yy+  | t == p = yy -- predicate children are incompatible   | otherwise = xx merge xx@(UMore t mx xs) yy@(UPred p w mrx xrs)-  | t == p = yy -- predicate children are incompatible+  | t == p = yy -- rightward bias   | otherwise = xx merge xx@(UPred t q mrx xrs) yy@(UMore p my ys)-  | t == p = yy+  | t == p = yy -- rightward bias   | otherwise = xx  @@ -74,7 +72,32 @@ getFirst (Just x :xs) = Just x  -buildLitSingletonTail :: NonEmpty t -> x -> UPTrie t x-buildLitSingletonTail (t:|[]) x = UMore t (Just x) []-buildLitSingletonTail (t:|ts) x = UMore t Nothing  [buildLitSingletonTail (NE.fromList ts) x]+litSingletonTail :: NonEmpty t -> x -> UPTrie t x+litSingletonTail (t:|[]) x = UMore t (Just x) []+litSingletonTail (t:|ts) x = UMore t Nothing  [litSingletonTail (NE.fromList ts) x]+++litExtrudeTail :: [t] -> UPTrie t x -> UPTrie t x+litExtrudeTail [] r = r+litExtrudeTail (t:ts) r = UMore t Nothing [litExtrudeTail ts r]+++-- also does a non-deterministic merge - make sure your nodes are disjoint & clean+sort :: (Eq t) => [UPTrie t x] -> [UPTrie t x]+sort = foldr insert []+  where+    insert :: (Eq t) => UPTrie t x -> [UPTrie t x] -> [UPTrie t x]+    insert r [] = [r]+    insert x@(UMore t _ _) (y@(UMore p _ _):rs)+      | t == p = x : rs+      | otherwise = x : y : rs+    insert x@(UMore t _ _) (y@(UPred p _ _ _):rs)+      | t == p = x : rs+      | otherwise = x : y : rs+    insert x@(UPred t _ _ _) (y@(UPred p _ _ _):rs)+      | t == p = x : rs -- basis+      | otherwise = x : y : rs+    insert x@(UPred t _ _ _) (y@(UMore p _ _):rs)+      | t == p = insert x rs+      | otherwise = y : insert x rs