summaryrefslogtreecommitdiff
path: root/src/Data
diff options
context:
space:
mode:
authorjoe <joe@jerkface.net>2017-01-27 04:34:32 -0500
committerjoe <joe@jerkface.net>2017-01-27 04:34:32 -0500
commit77a317310d4f7929335fafe3cfbf53afd45faa82 (patch)
tree220e885dfc44af98998faee7660b9e9ef7363220 /src/Data
parent6a239e20bbc7a84a74721d23587bbf1b8c20c704 (diff)
Switched PSQueue to psqueues for strict spine.
Diffstat (limited to 'src/Data')
-rw-r--r--src/Data/Wrapper/PSQ.hs41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/Data/Wrapper/PSQ.hs b/src/Data/Wrapper/PSQ.hs
new file mode 100644
index 00000000..e8fa2d98
--- /dev/null
+++ b/src/Data/Wrapper/PSQ.hs
@@ -0,0 +1,41 @@
1{-# LANGUAGE PatternSynonyms #-}
2{-# LANGUAGE CPP #-}
3module Data.Wrapper.PSQ
4#if 0
5 ( module Data.PSQueue ) where ; import Data.PSQueue
6#else
7 ( module Data.Wrapper.PSQ , module OrdPSQ ) where
8
9import Data.OrdPSQ as OrdPSQ hiding (insert, map, singleton, minView)
10import qualified Data.OrdPSQ as OrdPSQ
11
12type PSQ k p = OrdPSQ k p ()
13type Binding k p = (k,p,())
14
15pattern (:->) :: k -> p -> Binding k p
16pattern k :-> p <- (k,p,()) where k :-> p = (k,p,())
17
18key :: Binding k v -> k
19key (k,p,v) = k
20{-# INLINE key #-}
21
22insert :: (Ord k, Ord p) => k -> p -> PSQ k p -> PSQ k p
23insert k p q = OrdPSQ.insert k p () q
24{-# INLINE insert #-}
25
26insertWith :: (Ord k, Ord p) => (p -> p -> p) -> k -> p -> PSQ k p -> PSQ k p
27insertWith f k p0 q = snd $ OrdPSQ.alter f' k q
28 where
29 f' (Just (p,())) = ((),Just (f p0 p, ()))
30 f' Nothing = ((),Nothing)
31{-# INLINE insertWith #-}
32
33singleton :: (Ord k, Ord p) => k -> p -> PSQ k p
34singleton k p = OrdPSQ.singleton k p ()
35{-# INLINE singleton #-}
36
37minView :: (Ord k, Ord p) => PSQ k p -> Maybe (Binding k p, PSQ k p)
38minView q = fmap (\(k,p,(),q') -> (k :-> p, q')) $ OrdPSQ.minView q
39{-# INLINE minView #-}
40
41#endif