diff options
author | joe <joe@jerkface.net> | 2017-01-27 04:34:32 -0500 |
---|---|---|
committer | joe <joe@jerkface.net> | 2017-01-27 04:34:32 -0500 |
commit | 77a317310d4f7929335fafe3cfbf53afd45faa82 (patch) | |
tree | 220e885dfc44af98998faee7660b9e9ef7363220 /src/Data | |
parent | 6a239e20bbc7a84a74721d23587bbf1b8c20c704 (diff) |
Switched PSQueue to psqueues for strict spine.
Diffstat (limited to 'src/Data')
-rw-r--r-- | src/Data/Wrapper/PSQ.hs | 41 |
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 #-} | ||
3 | module 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 | |||
9 | import Data.OrdPSQ as OrdPSQ hiding (insert, map, singleton, minView) | ||
10 | import qualified Data.OrdPSQ as OrdPSQ | ||
11 | |||
12 | type PSQ k p = OrdPSQ k p () | ||
13 | type Binding k p = (k,p,()) | ||
14 | |||
15 | pattern (:->) :: k -> p -> Binding k p | ||
16 | pattern k :-> p <- (k,p,()) where k :-> p = (k,p,()) | ||
17 | |||
18 | key :: Binding k v -> k | ||
19 | key (k,p,v) = k | ||
20 | {-# INLINE key #-} | ||
21 | |||
22 | insert :: (Ord k, Ord p) => k -> p -> PSQ k p -> PSQ k p | ||
23 | insert k p q = OrdPSQ.insert k p () q | ||
24 | {-# INLINE insert #-} | ||
25 | |||
26 | insertWith :: (Ord k, Ord p) => (p -> p -> p) -> k -> p -> PSQ k p -> PSQ k p | ||
27 | insertWith 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 | |||
33 | singleton :: (Ord k, Ord p) => k -> p -> PSQ k p | ||
34 | singleton k p = OrdPSQ.singleton k p () | ||
35 | {-# INLINE singleton #-} | ||
36 | |||
37 | minView :: (Ord k, Ord p) => PSQ k p -> Maybe (Binding k p, PSQ k p) | ||
38 | minView q = fmap (\(k,p,(),q') -> (k :-> p, q')) $ OrdPSQ.minView q | ||
39 | {-# INLINE minView #-} | ||
40 | |||
41 | #endif | ||