{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE Trustworthy #-}
{-# LANGUAGE CPP #-}
#if MIN_VERSION_base(4,9,0)
{-# LANGUAGE DataKinds #-}
#endif
module Data.GenericTrie.Internal
( TrieKey(..)
, Trie(..)
, OrdKey(..)
, genericTrieNull
, genericTrieMap
, genericTrieTraverse
, genericTrieShowsPrec
, genericInsert
, genericLookup
, genericDelete
, genericMapMaybeWithKey
, genericSingleton
, genericEmpty
, genericFoldWithKey
, genericTraverseWithKey
, TrieRepDefault
, GTrieKey(..)
, GTrie(..)
) where
import Control.Applicative (Applicative, liftA2)
import Data.Char (chr, ord)
import Data.Coerce (coerce)
import Data.Foldable (Foldable)
import Data.IntMap (IntMap)
import Data.Map (Map)
import Data.Maybe (isNothing)
import Data.Traversable (Traversable,traverse)
import GHC.Generics
import qualified Data.Foldable as Foldable
import qualified Data.IntMap as IntMap
import qualified Data.Map as Map
import Prelude
class TrieKey k where
type TrieRep k :: * -> *
trieEmpty :: Trie k a
trieNull :: Trie k a -> Bool
trieLookup :: k -> Trie k a -> Maybe a
trieInsert :: k -> a -> Trie k a -> Trie k a
trieDelete :: k -> Trie k a -> Trie k a
trieSingleton :: k -> a -> Trie k a
trieMap :: (a -> b) -> Trie k a -> Trie k b
trieTraverse :: Applicative f => (a -> f b) -> Trie k a -> f (Trie k b)
trieShowsPrec :: Show a => Int -> Trie k a -> ShowS
trieMapMaybeWithKey :: (k -> a -> Maybe b) -> Trie k a -> Trie k b
trieFoldWithKey :: (k -> a -> r -> r) -> r -> Trie k a -> r
trieTraverseWithKey :: Applicative f => (k -> a -> f b) -> Trie k a -> f (Trie k b)
trieMergeWithKey :: (k -> a -> b -> Maybe c) ->
(Trie k a -> Trie k c) ->
(Trie k b -> Trie k c) ->
Trie k a -> Trie k b -> Trie k c
type instance TrieRep k = TrieRepDefault k
default trieEmpty :: ( TrieRep k ~ TrieRepDefault k) => Trie k a
trieEmpty = Trie k a
forall k a. (TrieRep k ~ TrieRepDefault k) => Trie k a
genericEmpty
default trieSingleton ::
( GTrieKey (Rep k), Generic k , TrieRep k ~ TrieRepDefault k) =>
k -> a -> Trie k a
trieSingleton = k -> a -> Trie k a
forall k a.
(GTrieKey (Rep k), Generic k, TrieRep k ~ TrieRepDefault k) =>
k -> a -> Trie k a
genericSingleton
default trieNull ::
( TrieRep k ~ TrieRepDefault k) =>
Trie k a -> Bool
trieNull = Trie k a -> Bool
forall k a. (TrieRep k ~ TrieRepDefault k) => Trie k a -> Bool
genericTrieNull
default trieLookup ::
( GTrieKey (Rep k), Generic k , TrieRep k ~ TrieRepDefault k) =>
k -> Trie k a -> Maybe a
trieLookup = k -> Trie k a -> Maybe a
forall k a.
(GTrieKey (Rep k), Generic k, TrieRep k ~ TrieRepDefault k) =>
k -> Trie k a -> Maybe a
genericLookup
default trieInsert ::
( GTrieKey (Rep k), Generic k , TrieRep k ~ TrieRepDefault k) =>
k -> a -> Trie k a -> Trie k a
trieInsert = k -> a -> Trie k a -> Trie k a
forall k a.
(GTrieKey (Rep k), Generic k, TrieRep k ~ TrieRepDefault k) =>
k -> a -> Trie k a -> Trie k a
genericInsert
default trieDelete ::
( GTrieKey (Rep k), Generic k , TrieRep k ~ TrieRepDefault k) =>
k -> Trie k a -> Trie k a
trieDelete = k -> Trie k a -> Trie k a
forall k a.
(GTrieKey (Rep k), Generic k, TrieRep k ~ TrieRepDefault k) =>
k -> Trie k a -> Trie k a
genericDelete
default trieMap ::
( GTrieKey (Rep k) , TrieRep k ~ TrieRepDefault k) =>
(a -> b) -> Trie k a -> Trie k b
trieMap = (a -> b) -> Trie k a -> Trie k b
forall k a b.
(GTrieKey (Rep k), TrieRep k ~ TrieRepDefault k) =>
(a -> b) -> Trie k a -> Trie k b
genericTrieMap
default trieTraverse ::
( GTrieKey (Rep k) , TrieRep k ~ TrieRepDefault k , Applicative f) =>
(a -> f b) -> Trie k a -> f (Trie k b)
trieTraverse = (a -> f b) -> Trie k a -> f (Trie k b)
forall k (f :: * -> *) a b.
(GTrieKey (Rep k), TrieRep k ~ TrieRepDefault k, Applicative f) =>
(a -> f b) -> Trie k a -> f (Trie k b)
genericTrieTraverse
default trieShowsPrec ::
( Show a, GTrieKeyShow (Rep k) , TrieRep k ~ TrieRepDefault k) =>
Int -> Trie k a -> ShowS
trieShowsPrec = Int -> Trie k a -> ShowS
forall a k.
(Show a, GTrieKeyShow (Rep k), TrieRep k ~ TrieRepDefault k) =>
Int -> Trie k a -> ShowS
genericTrieShowsPrec
default trieMapMaybeWithKey ::
( GTrieKey (Rep k) , Generic k, TrieRep k ~ TrieRepDefault k) =>
(k -> a -> Maybe b) -> Trie k a -> Trie k b
trieMapMaybeWithKey = (k -> a -> Maybe b) -> Trie k a -> Trie k b
forall k a b.
(GTrieKey (Rep k), Generic k, TrieRep k ~ TrieRepDefault k) =>
(k -> a -> Maybe b) -> Trie k a -> Trie k b
genericMapMaybeWithKey
default trieFoldWithKey ::
( GTrieKey (Rep k) , TrieRep k ~ TrieRepDefault k, Generic k) =>
(k -> a -> r -> r) -> r -> Trie k a -> r
trieFoldWithKey = (k -> a -> r -> r) -> r -> Trie k a -> r
forall k a r.
(GTrieKey (Rep k), Generic k, TrieRep k ~ TrieRepDefault k) =>
(k -> a -> r -> r) -> r -> Trie k a -> r
genericFoldWithKey
default trieTraverseWithKey ::
( GTrieKey (Rep k) , TrieRep k ~ TrieRepDefault k, Generic k, Applicative f) =>
(k -> a -> f b) -> Trie k a -> f (Trie k b)
trieTraverseWithKey = (k -> a -> f b) -> Trie k a -> f (Trie k b)
forall k (f :: * -> *) a b.
(GTrieKey (Rep k), Generic k, TrieRep k ~ TrieRepDefault k,
Applicative f) =>
(k -> a -> f b) -> Trie k a -> f (Trie k b)
genericTraverseWithKey
default trieMergeWithKey ::
( GTrieKey (Rep k) , TrieRep k ~ TrieRepDefault k, Generic k ) =>
(k -> a -> b -> Maybe c) ->
(Trie k a -> Trie k c) ->
(Trie k b -> Trie k c) ->
Trie k a -> Trie k b -> Trie k c
trieMergeWithKey = (k -> a -> b -> Maybe c)
-> (Trie k a -> Trie k c)
-> (Trie k b -> Trie k c)
-> Trie k a
-> Trie k b
-> Trie k c
forall k a b c.
(GTrieKey (Rep k), Generic k, TrieRep k ~ TrieRepDefault k) =>
(k -> a -> b -> Maybe c)
-> (Trie k a -> Trie k c)
-> (Trie k b -> Trie k c)
-> Trie k a
-> Trie k b
-> Trie k c
genericMergeWithKey
newtype Trie k a = MkTrie (TrieRep k a)
instance TrieKey Int where
type TrieRep Int = IntMap
trieLookup :: Int -> Trie Int a -> Maybe a
trieLookup k :: Int
k (MkTrie x :: TrieRep Int a
x) = Int -> IntMap a -> Maybe a
forall a. Int -> IntMap a -> Maybe a
IntMap.lookup Int
k IntMap a
TrieRep Int a
x
trieInsert :: Int -> a -> Trie Int a -> Trie Int a
trieInsert k :: Int
k v :: a
v (MkTrie t :: TrieRep Int a
t) = TrieRep Int a -> Trie Int a
forall k a. TrieRep k a -> Trie k a
MkTrie (Int -> a -> IntMap a -> IntMap a
forall a. Int -> a -> IntMap a -> IntMap a
IntMap.insert Int
k a
v IntMap a
TrieRep Int a
t)
trieDelete :: Int -> Trie Int a -> Trie Int a
trieDelete k :: Int
k (MkTrie t :: TrieRep Int a
t) = TrieRep Int a -> Trie Int a
forall k a. TrieRep k a -> Trie k a
MkTrie (Int -> IntMap a -> IntMap a
forall a. Int -> IntMap a -> IntMap a
IntMap.delete Int
k IntMap a
TrieRep Int a
t)
trieEmpty :: Trie Int a
trieEmpty = TrieRep Int a -> Trie Int a
forall k a. TrieRep k a -> Trie k a
MkTrie TrieRep Int a
forall a. IntMap a
IntMap.empty
trieSingleton :: Int -> a -> Trie Int a
trieSingleton k :: Int
k v :: a
v = TrieRep Int a -> Trie Int a
forall k a. TrieRep k a -> Trie k a
MkTrie (Int -> a -> IntMap a
forall a. Int -> a -> IntMap a
IntMap.singleton Int
k a
v)
trieNull :: Trie Int a -> Bool
trieNull (MkTrie x :: TrieRep Int a
x) = IntMap a -> Bool
forall a. IntMap a -> Bool
IntMap.null IntMap a
TrieRep Int a
x
trieMap :: (a -> b) -> Trie Int a -> Trie Int b
trieMap f :: a -> b
f (MkTrie x :: TrieRep Int a
x) = TrieRep Int b -> Trie Int b
forall k a. TrieRep k a -> Trie k a
MkTrie ((a -> b) -> IntMap a -> IntMap b
forall a b. (a -> b) -> IntMap a -> IntMap b
IntMap.map a -> b
f IntMap a
TrieRep Int a
x)
trieTraverse :: (a -> f b) -> Trie Int a -> f (Trie Int b)
trieTraverse f :: a -> f b
f (MkTrie x :: TrieRep Int a
x) = (IntMap b -> Trie Int b) -> f (IntMap b) -> f (Trie Int b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap IntMap b -> Trie Int b
forall k a. TrieRep k a -> Trie k a
MkTrie ((a -> f b) -> IntMap a -> f (IntMap b)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse a -> f b
f IntMap a
TrieRep Int a
x)
trieShowsPrec :: Int -> Trie Int a -> ShowS
trieShowsPrec p :: Int
p (MkTrie x :: TrieRep Int a
x) = Int -> IntMap a -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
p IntMap a
TrieRep Int a
x
trieMapMaybeWithKey :: (Int -> a -> Maybe b) -> Trie Int a -> Trie Int b
trieMapMaybeWithKey f :: Int -> a -> Maybe b
f (MkTrie x :: TrieRep Int a
x) = TrieRep Int b -> Trie Int b
forall k a. TrieRep k a -> Trie k a
MkTrie ((Int -> a -> Maybe b) -> IntMap a -> IntMap b
forall a b. (Int -> a -> Maybe b) -> IntMap a -> IntMap b
IntMap.mapMaybeWithKey Int -> a -> Maybe b
f IntMap a
TrieRep Int a
x)
trieFoldWithKey :: (Int -> a -> r -> r) -> r -> Trie Int a -> r
trieFoldWithKey f :: Int -> a -> r -> r
f z :: r
z (MkTrie x :: TrieRep Int a
x) = (Int -> a -> r -> r) -> r -> IntMap a -> r
forall a b. (Int -> a -> b -> b) -> b -> IntMap a -> b
IntMap.foldrWithKey Int -> a -> r -> r
f r
z IntMap a
TrieRep Int a
x
trieTraverseWithKey :: (Int -> a -> f b) -> Trie Int a -> f (Trie Int b)
trieTraverseWithKey f :: Int -> a -> f b
f (MkTrie x :: TrieRep Int a
x) = (IntMap b -> Trie Int b) -> f (IntMap b) -> f (Trie Int b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap IntMap b -> Trie Int b
forall k a. TrieRep k a -> Trie k a
MkTrie ((Int -> a -> f b) -> IntMap a -> f (IntMap b)
forall (t :: * -> *) a b.
Applicative t =>
(Int -> a -> t b) -> IntMap a -> t (IntMap b)
IntMap.traverseWithKey Int -> a -> f b
f IntMap a
TrieRep Int a
x)
trieMergeWithKey :: (Int -> a -> b -> Maybe c)
-> (Trie Int a -> Trie Int c)
-> (Trie Int b -> Trie Int c)
-> Trie Int a
-> Trie Int b
-> Trie Int c
trieMergeWithKey f :: Int -> a -> b -> Maybe c
f g :: Trie Int a -> Trie Int c
g h :: Trie Int b -> Trie Int c
h (MkTrie x :: TrieRep Int a
x) (MkTrie y :: TrieRep Int b
y) = TrieRep Int c -> Trie Int c
forall k a. TrieRep k a -> Trie k a
MkTrie ((Int -> a -> b -> Maybe c)
-> (IntMap a -> IntMap c)
-> (IntMap b -> IntMap c)
-> IntMap a
-> IntMap b
-> IntMap c
forall a b c.
(Int -> a -> b -> Maybe c)
-> (IntMap a -> IntMap c)
-> (IntMap b -> IntMap c)
-> IntMap a
-> IntMap b
-> IntMap c
IntMap.mergeWithKey Int -> a -> b -> Maybe c
f ((Trie Int a -> Trie Int c) -> IntMap a -> IntMap c
forall a b. Coercible a b => a -> b
coerce Trie Int a -> Trie Int c
g) ((Trie Int b -> Trie Int c) -> IntMap b -> IntMap c
forall a b. Coercible a b => a -> b
coerce Trie Int b -> Trie Int c
h) IntMap a
TrieRep Int a
x IntMap b
TrieRep Int b
y)
{-# INLINABLE trieEmpty #-}
{-# INLINABLE trieInsert #-}
{-# INLINABLE trieLookup #-}
{-# INLINABLE trieDelete #-}
{-# INLINABLE trieSingleton #-}
{-# INLINABLE trieFoldWithKey #-}
{-# INLINABLE trieShowsPrec #-}
{-# INLINABLE trieTraverse #-}
{-# INLINABLE trieTraverseWithKey #-}
{-# INLINABLE trieNull #-}
{-# INLINABLE trieMap #-}
{-# INLINABLE trieMergeWithKey #-}
{-# INLINABLE trieMapMaybeWithKey #-}
instance TrieKey Integer where
type TrieRep Integer = Map Integer
trieLookup :: Integer -> Trie Integer a -> Maybe a
trieLookup k :: Integer
k (MkTrie t :: TrieRep Integer a
t) = Integer -> Map Integer a -> Maybe a
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup Integer
k Map Integer a
TrieRep Integer a
t
trieInsert :: Integer -> a -> Trie Integer a -> Trie Integer a
trieInsert k :: Integer
k v :: a
v (MkTrie t :: TrieRep Integer a
t) = TrieRep Integer a -> Trie Integer a
forall k a. TrieRep k a -> Trie k a
MkTrie (Integer -> a -> Map Integer a -> Map Integer a
forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert Integer
k a
v Map Integer a
TrieRep Integer a
t)
trieDelete :: Integer -> Trie Integer a -> Trie Integer a
trieDelete k :: Integer
k (MkTrie t :: TrieRep Integer a
t) = TrieRep Integer a -> Trie Integer a
forall k a. TrieRep k a -> Trie k a
MkTrie (Integer -> Map Integer a -> Map Integer a
forall k a. Ord k => k -> Map k a -> Map k a
Map.delete Integer
k Map Integer a
TrieRep Integer a
t)
trieEmpty :: Trie Integer a
trieEmpty = TrieRep Integer a -> Trie Integer a
forall k a. TrieRep k a -> Trie k a
MkTrie TrieRep Integer a
forall k a. Map k a
Map.empty
trieSingleton :: Integer -> a -> Trie Integer a
trieSingleton k :: Integer
k v :: a
v = TrieRep Integer a -> Trie Integer a
forall k a. TrieRep k a -> Trie k a
MkTrie (Integer -> a -> Map Integer a
forall k a. k -> a -> Map k a
Map.singleton Integer
k a
v)
trieNull :: Trie Integer a -> Bool
trieNull (MkTrie x :: TrieRep Integer a
x) = Map Integer a -> Bool
forall k a. Map k a -> Bool
Map.null Map Integer a
TrieRep Integer a
x
trieMap :: (a -> b) -> Trie Integer a -> Trie Integer b
trieMap f :: a -> b
f (MkTrie x :: TrieRep Integer a
x) = TrieRep Integer b -> Trie Integer b
forall k a. TrieRep k a -> Trie k a
MkTrie ((a -> b) -> Map Integer a -> Map Integer b
forall a b k. (a -> b) -> Map k a -> Map k b
Map.map a -> b
f Map Integer a
TrieRep Integer a
x)
trieTraverse :: (a -> f b) -> Trie Integer a -> f (Trie Integer b)
trieTraverse f :: a -> f b
f (MkTrie x :: TrieRep Integer a
x) = (Map Integer b -> Trie Integer b)
-> f (Map Integer b) -> f (Trie Integer b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Map Integer b -> Trie Integer b
forall k a. TrieRep k a -> Trie k a
MkTrie ((a -> f b) -> Map Integer a -> f (Map Integer b)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse a -> f b
f Map Integer a
TrieRep Integer a
x)
trieShowsPrec :: Int -> Trie Integer a -> ShowS
trieShowsPrec p :: Int
p (MkTrie x :: TrieRep Integer a
x) = Int -> Map Integer a -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
p Map Integer a
TrieRep Integer a
x
trieMapMaybeWithKey :: (Integer -> a -> Maybe b) -> Trie Integer a -> Trie Integer b
trieMapMaybeWithKey f :: Integer -> a -> Maybe b
f (MkTrie x :: TrieRep Integer a
x) = TrieRep Integer b -> Trie Integer b
forall k a. TrieRep k a -> Trie k a
MkTrie ((Integer -> a -> Maybe b) -> Map Integer a -> Map Integer b
forall k a b. (k -> a -> Maybe b) -> Map k a -> Map k b
Map.mapMaybeWithKey Integer -> a -> Maybe b
f Map Integer a
TrieRep Integer a
x)
trieFoldWithKey :: (Integer -> a -> r -> r) -> r -> Trie Integer a -> r
trieFoldWithKey f :: Integer -> a -> r -> r
f z :: r
z (MkTrie x :: TrieRep Integer a
x) = (Integer -> a -> r -> r) -> r -> Map Integer a -> r
forall k a b. (k -> a -> b -> b) -> b -> Map k a -> b
Map.foldrWithKey Integer -> a -> r -> r
f r
z Map Integer a
TrieRep Integer a
x
trieTraverseWithKey :: (Integer -> a -> f b) -> Trie Integer a -> f (Trie Integer b)
trieTraverseWithKey f :: Integer -> a -> f b
f (MkTrie x :: TrieRep Integer a
x) = (Map Integer b -> Trie Integer b)
-> f (Map Integer b) -> f (Trie Integer b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Map Integer b -> Trie Integer b
forall k a. TrieRep k a -> Trie k a
MkTrie ((Integer -> a -> f b) -> Map Integer a -> f (Map Integer b)
forall (t :: * -> *) k a b.
Applicative t =>
(k -> a -> t b) -> Map k a -> t (Map k b)
Map.traverseWithKey Integer -> a -> f b
f Map Integer a
TrieRep Integer a
x)
trieMergeWithKey :: (Integer -> a -> b -> Maybe c)
-> (Trie Integer a -> Trie Integer c)
-> (Trie Integer b -> Trie Integer c)
-> Trie Integer a
-> Trie Integer b
-> Trie Integer c
trieMergeWithKey f :: Integer -> a -> b -> Maybe c
f g :: Trie Integer a -> Trie Integer c
g h :: Trie Integer b -> Trie Integer c
h (MkTrie x :: TrieRep Integer a
x) (MkTrie y :: TrieRep Integer b
y) = TrieRep Integer c -> Trie Integer c
forall k a. TrieRep k a -> Trie k a
MkTrie ((Integer -> a -> b -> Maybe c)
-> (Map Integer a -> Map Integer c)
-> (Map Integer b -> Map Integer c)
-> Map Integer a
-> Map Integer b
-> Map Integer c
forall k a b c.
Ord k =>
(k -> a -> b -> Maybe c)
-> (Map k a -> Map k c)
-> (Map k b -> Map k c)
-> Map k a
-> Map k b
-> Map k c
Map.mergeWithKey Integer -> a -> b -> Maybe c
f ((Trie Integer a -> Trie Integer c)
-> Map Integer a -> Map Integer c
forall a b. Coercible a b => a -> b
coerce Trie Integer a -> Trie Integer c
g) ((Trie Integer b -> Trie Integer c)
-> Map Integer b -> Map Integer c
forall a b. Coercible a b => a -> b
coerce Trie Integer b -> Trie Integer c
h) Map Integer a
TrieRep Integer a
x Map Integer b
TrieRep Integer b
y)
{-# INLINABLE trieEmpty #-}
{-# INLINABLE trieInsert #-}
{-# INLINABLE trieLookup #-}
{-# INLINABLE trieDelete #-}
{-# INLINABLE trieSingleton #-}
{-# INLINABLE trieFoldWithKey #-}
{-# INLINABLE trieShowsPrec #-}
{-# INLINABLE trieTraverse #-}
{-# INLINABLE trieTraverseWithKey #-}
{-# INLINABLE trieNull #-}
{-# INLINABLE trieMap #-}
{-# INLINABLE trieMergeWithKey #-}
{-# INLINABLE trieMapMaybeWithKey #-}
instance TrieKey Char where
type TrieRep Char = IntMap
trieLookup :: Char -> Trie Char a -> Maybe a
trieLookup k :: Char
k (MkTrie t :: TrieRep Char a
t) = Int -> IntMap a -> Maybe a
forall a. Int -> IntMap a -> Maybe a
IntMap.lookup (Char -> Int
ord Char
k) IntMap a
TrieRep Char a
t
trieDelete :: Char -> Trie Char a -> Trie Char a
trieDelete k :: Char
k (MkTrie t :: TrieRep Char a
t) = TrieRep Char a -> Trie Char a
forall k a. TrieRep k a -> Trie k a
MkTrie (Int -> IntMap a -> IntMap a
forall a. Int -> IntMap a -> IntMap a
IntMap.delete (Char -> Int
ord Char
k) IntMap a
TrieRep Char a
t)
trieInsert :: Char -> a -> Trie Char a -> Trie Char a
trieInsert k :: Char
k v :: a
v (MkTrie t :: TrieRep Char a
t) = TrieRep Char a -> Trie Char a
forall k a. TrieRep k a -> Trie k a
MkTrie (Int -> a -> IntMap a -> IntMap a
forall a. Int -> a -> IntMap a -> IntMap a
IntMap.insert (Char -> Int
ord Char
k) a
v IntMap a
TrieRep Char a
t)
trieEmpty :: Trie Char a
trieEmpty = TrieRep Char a -> Trie Char a
forall k a. TrieRep k a -> Trie k a
MkTrie TrieRep Char a
forall a. IntMap a
IntMap.empty
trieSingleton :: Char -> a -> Trie Char a
trieSingleton k :: Char
k v :: a
v = TrieRep Char a -> Trie Char a
forall k a. TrieRep k a -> Trie k a
MkTrie (Int -> a -> IntMap a
forall a. Int -> a -> IntMap a
IntMap.singleton (Char -> Int
ord Char
k) a
v)
trieNull :: Trie Char a -> Bool
trieNull (MkTrie x :: TrieRep Char a
x) = IntMap a -> Bool
forall a. IntMap a -> Bool
IntMap.null IntMap a
TrieRep Char a
x
trieMap :: (a -> b) -> Trie Char a -> Trie Char b
trieMap f :: a -> b
f (MkTrie x :: TrieRep Char a
x) = TrieRep Char b -> Trie Char b
forall k a. TrieRep k a -> Trie k a
MkTrie ((a -> b) -> IntMap a -> IntMap b
forall a b. (a -> b) -> IntMap a -> IntMap b
IntMap.map a -> b
f IntMap a
TrieRep Char a
x)
trieTraverse :: (a -> f b) -> Trie Char a -> f (Trie Char b)
trieTraverse f :: a -> f b
f (MkTrie x :: TrieRep Char a
x) = (IntMap b -> Trie Char b) -> f (IntMap b) -> f (Trie Char b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap IntMap b -> Trie Char b
forall k a. TrieRep k a -> Trie k a
MkTrie ((a -> f b) -> IntMap a -> f (IntMap b)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse a -> f b
f IntMap a
TrieRep Char a
x)
trieShowsPrec :: Int -> Trie Char a -> ShowS
trieShowsPrec p :: Int
p (MkTrie x :: TrieRep Char a
x) = Int -> IntMap a -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
p IntMap a
TrieRep Char a
x
trieMapMaybeWithKey :: (Char -> a -> Maybe b) -> Trie Char a -> Trie Char b
trieMapMaybeWithKey f :: Char -> a -> Maybe b
f (MkTrie x :: TrieRep Char a
x) = TrieRep Char b -> Trie Char b
forall k a. TrieRep k a -> Trie k a
MkTrie ((Int -> a -> Maybe b) -> IntMap a -> IntMap b
forall a b. (Int -> a -> Maybe b) -> IntMap a -> IntMap b
IntMap.mapMaybeWithKey (Char -> a -> Maybe b
f (Char -> a -> Maybe b) -> (Int -> Char) -> Int -> a -> Maybe b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Char
chr) IntMap a
TrieRep Char a
x)
trieFoldWithKey :: (Char -> a -> r -> r) -> r -> Trie Char a -> r
trieFoldWithKey f :: Char -> a -> r -> r
f z :: r
z (MkTrie x :: TrieRep Char a
x) = (Int -> a -> r -> r) -> r -> IntMap a -> r
forall a b. (Int -> a -> b -> b) -> b -> IntMap a -> b
IntMap.foldrWithKey (Char -> a -> r -> r
f (Char -> a -> r -> r) -> (Int -> Char) -> Int -> a -> r -> r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Char
chr) r
z IntMap a
TrieRep Char a
x
trieTraverseWithKey :: (Char -> a -> f b) -> Trie Char a -> f (Trie Char b)
trieTraverseWithKey f :: Char -> a -> f b
f (MkTrie x :: TrieRep Char a
x) = (IntMap b -> Trie Char b) -> f (IntMap b) -> f (Trie Char b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap IntMap b -> Trie Char b
forall k a. TrieRep k a -> Trie k a
MkTrie ((Int -> a -> f b) -> IntMap a -> f (IntMap b)
forall (t :: * -> *) a b.
Applicative t =>
(Int -> a -> t b) -> IntMap a -> t (IntMap b)
IntMap.traverseWithKey (Char -> a -> f b
f (Char -> a -> f b) -> (Int -> Char) -> Int -> a -> f b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Char
chr) IntMap a
TrieRep Char a
x)
trieMergeWithKey :: (Char -> a -> b -> Maybe c)
-> (Trie Char a -> Trie Char c)
-> (Trie Char b -> Trie Char c)
-> Trie Char a
-> Trie Char b
-> Trie Char c
trieMergeWithKey f :: Char -> a -> b -> Maybe c
f g :: Trie Char a -> Trie Char c
g h :: Trie Char b -> Trie Char c
h (MkTrie x :: TrieRep Char a
x) (MkTrie y :: TrieRep Char b
y) = TrieRep Char c -> Trie Char c
forall k a. TrieRep k a -> Trie k a
MkTrie ((Int -> a -> b -> Maybe c)
-> (IntMap a -> IntMap c)
-> (IntMap b -> IntMap c)
-> IntMap a
-> IntMap b
-> IntMap c
forall a b c.
(Int -> a -> b -> Maybe c)
-> (IntMap a -> IntMap c)
-> (IntMap b -> IntMap c)
-> IntMap a
-> IntMap b
-> IntMap c
IntMap.mergeWithKey (Char -> a -> b -> Maybe c
f (Char -> a -> b -> Maybe c)
-> (Int -> Char) -> Int -> a -> b -> Maybe c
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Char
chr) ((Trie Char a -> Trie Char c) -> IntMap a -> IntMap c
forall a b. Coercible a b => a -> b
coerce Trie Char a -> Trie Char c
g) ((Trie Char b -> Trie Char c) -> IntMap b -> IntMap c
forall a b. Coercible a b => a -> b
coerce Trie Char b -> Trie Char c
h) IntMap a
TrieRep Char a
x IntMap b
TrieRep Char b
y)
{-# INLINABLE trieEmpty #-}
{-# INLINABLE trieInsert #-}
{-# INLINABLE trieLookup #-}
{-# INLINABLE trieDelete #-}
{-# INLINABLE trieSingleton #-}
{-# INLINABLE trieFoldWithKey #-}
{-# INLINABLE trieShowsPrec #-}
{-# INLINABLE trieTraverse #-}
{-# INLINABLE trieTraverseWithKey #-}
{-# INLINABLE trieNull #-}
{-# INLINABLE trieMap #-}
{-# INLINABLE trieMergeWithKey #-}
{-# INLINABLE trieMapMaybeWithKey #-}
newtype OrdKey k = OrdKey { OrdKey k -> k
getOrdKey :: k }
deriving (ReadPrec [OrdKey k]
ReadPrec (OrdKey k)
Int -> ReadS (OrdKey k)
ReadS [OrdKey k]
(Int -> ReadS (OrdKey k))
-> ReadS [OrdKey k]
-> ReadPrec (OrdKey k)
-> ReadPrec [OrdKey k]
-> Read (OrdKey k)
forall k. Read k => ReadPrec [OrdKey k]
forall k. Read k => ReadPrec (OrdKey k)
forall k. Read k => Int -> ReadS (OrdKey k)
forall k. Read k => ReadS [OrdKey k]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [OrdKey k]
$creadListPrec :: forall k. Read k => ReadPrec [OrdKey k]
readPrec :: ReadPrec (OrdKey k)
$creadPrec :: forall k. Read k => ReadPrec (OrdKey k)
readList :: ReadS [OrdKey k]
$creadList :: forall k. Read k => ReadS [OrdKey k]
readsPrec :: Int -> ReadS (OrdKey k)
$creadsPrec :: forall k. Read k => Int -> ReadS (OrdKey k)
Read, Int -> OrdKey k -> ShowS
[OrdKey k] -> ShowS
OrdKey k -> String
(Int -> OrdKey k -> ShowS)
-> (OrdKey k -> String) -> ([OrdKey k] -> ShowS) -> Show (OrdKey k)
forall k. Show k => Int -> OrdKey k -> ShowS
forall k. Show k => [OrdKey k] -> ShowS
forall k. Show k => OrdKey k -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [OrdKey k] -> ShowS
$cshowList :: forall k. Show k => [OrdKey k] -> ShowS
show :: OrdKey k -> String
$cshow :: forall k. Show k => OrdKey k -> String
showsPrec :: Int -> OrdKey k -> ShowS
$cshowsPrec :: forall k. Show k => Int -> OrdKey k -> ShowS
Show, OrdKey k -> OrdKey k -> Bool
(OrdKey k -> OrdKey k -> Bool)
-> (OrdKey k -> OrdKey k -> Bool) -> Eq (OrdKey k)
forall k. Eq k => OrdKey k -> OrdKey k -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: OrdKey k -> OrdKey k -> Bool
$c/= :: forall k. Eq k => OrdKey k -> OrdKey k -> Bool
== :: OrdKey k -> OrdKey k -> Bool
$c== :: forall k. Eq k => OrdKey k -> OrdKey k -> Bool
Eq, Eq (OrdKey k)
Eq (OrdKey k) =>
(OrdKey k -> OrdKey k -> Ordering)
-> (OrdKey k -> OrdKey k -> Bool)
-> (OrdKey k -> OrdKey k -> Bool)
-> (OrdKey k -> OrdKey k -> Bool)
-> (OrdKey k -> OrdKey k -> Bool)
-> (OrdKey k -> OrdKey k -> OrdKey k)
-> (OrdKey k -> OrdKey k -> OrdKey k)
-> Ord (OrdKey k)
OrdKey k -> OrdKey k -> Bool
OrdKey k -> OrdKey k -> Ordering
OrdKey k -> OrdKey k -> OrdKey k
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall k. Ord k => Eq (OrdKey k)
forall k. Ord k => OrdKey k -> OrdKey k -> Bool
forall k. Ord k => OrdKey k -> OrdKey k -> Ordering
forall k. Ord k => OrdKey k -> OrdKey k -> OrdKey k
min :: OrdKey k -> OrdKey k -> OrdKey k
$cmin :: forall k. Ord k => OrdKey k -> OrdKey k -> OrdKey k
max :: OrdKey k -> OrdKey k -> OrdKey k
$cmax :: forall k. Ord k => OrdKey k -> OrdKey k -> OrdKey k
>= :: OrdKey k -> OrdKey k -> Bool
$c>= :: forall k. Ord k => OrdKey k -> OrdKey k -> Bool
> :: OrdKey k -> OrdKey k -> Bool
$c> :: forall k. Ord k => OrdKey k -> OrdKey k -> Bool
<= :: OrdKey k -> OrdKey k -> Bool
$c<= :: forall k. Ord k => OrdKey k -> OrdKey k -> Bool
< :: OrdKey k -> OrdKey k -> Bool
$c< :: forall k. Ord k => OrdKey k -> OrdKey k -> Bool
compare :: OrdKey k -> OrdKey k -> Ordering
$ccompare :: forall k. Ord k => OrdKey k -> OrdKey k -> Ordering
$cp1Ord :: forall k. Ord k => Eq (OrdKey k)
Ord)
instance (Show k, Ord k) => TrieKey (OrdKey k) where
type TrieRep (OrdKey k) = Map k
trieLookup :: OrdKey k -> Trie (OrdKey k) a -> Maybe a
trieLookup (OrdKey k :: k
k) (MkTrie x :: TrieRep (OrdKey k) a
x) = k -> Map k a -> Maybe a
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup k
k Map k a
TrieRep (OrdKey k) a
x
trieInsert :: OrdKey k -> a -> Trie (OrdKey k) a -> Trie (OrdKey k) a
trieInsert (OrdKey k :: k
k) v :: a
v (MkTrie x :: TrieRep (OrdKey k) a
x) = TrieRep (OrdKey k) a -> Trie (OrdKey k) a
forall k a. TrieRep k a -> Trie k a
MkTrie (k -> a -> Map k a -> Map k a
forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert k
k a
v Map k a
TrieRep (OrdKey k) a
x)
trieDelete :: OrdKey k -> Trie (OrdKey k) a -> Trie (OrdKey k) a
trieDelete (OrdKey k :: k
k) (MkTrie x :: TrieRep (OrdKey k) a
x) = TrieRep (OrdKey k) a -> Trie (OrdKey k) a
forall k a. TrieRep k a -> Trie k a
MkTrie (k -> Map k a -> Map k a
forall k a. Ord k => k -> Map k a -> Map k a
Map.delete k
k Map k a
TrieRep (OrdKey k) a
x)
trieEmpty :: Trie (OrdKey k) a
trieEmpty = TrieRep (OrdKey k) a -> Trie (OrdKey k) a
forall k a. TrieRep k a -> Trie k a
MkTrie TrieRep (OrdKey k) a
forall k a. Map k a
Map.empty
trieSingleton :: OrdKey k -> a -> Trie (OrdKey k) a
trieSingleton (OrdKey k :: k
k) v :: a
v = TrieRep (OrdKey k) a -> Trie (OrdKey k) a
forall k a. TrieRep k a -> Trie k a
MkTrie (k -> a -> Map k a
forall k a. k -> a -> Map k a
Map.singleton k
k a
v)
trieNull :: Trie (OrdKey k) a -> Bool
trieNull (MkTrie x :: TrieRep (OrdKey k) a
x) = Map k a -> Bool
forall k a. Map k a -> Bool
Map.null Map k a
TrieRep (OrdKey k) a
x
trieMap :: (a -> b) -> Trie (OrdKey k) a -> Trie (OrdKey k) b
trieMap f :: a -> b
f (MkTrie x :: TrieRep (OrdKey k) a
x) = TrieRep (OrdKey k) b -> Trie (OrdKey k) b
forall k a. TrieRep k a -> Trie k a
MkTrie ((a -> b) -> Map k a -> Map k b
forall a b k. (a -> b) -> Map k a -> Map k b
Map.map a -> b
f Map k a
TrieRep (OrdKey k) a
x)
trieTraverse :: (a -> f b) -> Trie (OrdKey k) a -> f (Trie (OrdKey k) b)
trieTraverse f :: a -> f b
f (MkTrie x :: TrieRep (OrdKey k) a
x) = (Map k b -> Trie (OrdKey k) b)
-> f (Map k b) -> f (Trie (OrdKey k) b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Map k b -> Trie (OrdKey k) b
forall k a. TrieRep k a -> Trie k a
MkTrie ((a -> f b) -> Map k a -> f (Map k b)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse a -> f b
f Map k a
TrieRep (OrdKey k) a
x)
trieShowsPrec :: Int -> Trie (OrdKey k) a -> ShowS
trieShowsPrec p :: Int
p (MkTrie x :: TrieRep (OrdKey k) a
x) = Int -> Map k a -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
p Map k a
TrieRep (OrdKey k) a
x
trieMapMaybeWithKey :: (OrdKey k -> a -> Maybe b)
-> Trie (OrdKey k) a -> Trie (OrdKey k) b
trieMapMaybeWithKey f :: OrdKey k -> a -> Maybe b
f (MkTrie x :: TrieRep (OrdKey k) a
x) = TrieRep (OrdKey k) b -> Trie (OrdKey k) b
forall k a. TrieRep k a -> Trie k a
MkTrie ((k -> a -> Maybe b) -> Map k a -> Map k b
forall k a b. (k -> a -> Maybe b) -> Map k a -> Map k b
Map.mapMaybeWithKey (OrdKey k -> a -> Maybe b
f (OrdKey k -> a -> Maybe b) -> (k -> OrdKey k) -> k -> a -> Maybe b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. k -> OrdKey k
forall k. k -> OrdKey k
OrdKey) Map k a
TrieRep (OrdKey k) a
x)
trieFoldWithKey :: (OrdKey k -> a -> r -> r) -> r -> Trie (OrdKey k) a -> r
trieFoldWithKey f :: OrdKey k -> a -> r -> r
f z :: r
z (MkTrie x :: TrieRep (OrdKey k) a
x) = (k -> a -> r -> r) -> r -> Map k a -> r
forall k a b. (k -> a -> b -> b) -> b -> Map k a -> b
Map.foldrWithKey (OrdKey k -> a -> r -> r
f (OrdKey k -> a -> r -> r) -> (k -> OrdKey k) -> k -> a -> r -> r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. k -> OrdKey k
forall k. k -> OrdKey k
OrdKey) r
z Map k a
TrieRep (OrdKey k) a
x
trieTraverseWithKey :: (OrdKey k -> a -> f b)
-> Trie (OrdKey k) a -> f (Trie (OrdKey k) b)
trieTraverseWithKey f :: OrdKey k -> a -> f b
f (MkTrie x :: TrieRep (OrdKey k) a
x) = (Map k b -> Trie (OrdKey k) b)
-> f (Map k b) -> f (Trie (OrdKey k) b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Map k b -> Trie (OrdKey k) b
forall k a. TrieRep k a -> Trie k a
MkTrie ((k -> a -> f b) -> Map k a -> f (Map k b)
forall (t :: * -> *) k a b.
Applicative t =>
(k -> a -> t b) -> Map k a -> t (Map k b)
Map.traverseWithKey (OrdKey k -> a -> f b
f (OrdKey k -> a -> f b) -> (k -> OrdKey k) -> k -> a -> f b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. k -> OrdKey k
forall k. k -> OrdKey k
OrdKey) Map k a
TrieRep (OrdKey k) a
x)
trieMergeWithKey :: (OrdKey k -> a -> b -> Maybe c)
-> (Trie (OrdKey k) a -> Trie (OrdKey k) c)
-> (Trie (OrdKey k) b -> Trie (OrdKey k) c)
-> Trie (OrdKey k) a
-> Trie (OrdKey k) b
-> Trie (OrdKey k) c
trieMergeWithKey f :: OrdKey k -> a -> b -> Maybe c
f g :: Trie (OrdKey k) a -> Trie (OrdKey k) c
g h :: Trie (OrdKey k) b -> Trie (OrdKey k) c
h (MkTrie x :: TrieRep (OrdKey k) a
x) (MkTrie y :: TrieRep (OrdKey k) b
y) = TrieRep (OrdKey k) c -> Trie (OrdKey k) c
forall k a. TrieRep k a -> Trie k a
MkTrie ((k -> a -> b -> Maybe c)
-> (Map k a -> Map k c)
-> (Map k b -> Map k c)
-> Map k a
-> Map k b
-> Map k c
forall k a b c.
Ord k =>
(k -> a -> b -> Maybe c)
-> (Map k a -> Map k c)
-> (Map k b -> Map k c)
-> Map k a
-> Map k b
-> Map k c
Map.mergeWithKey (OrdKey k -> a -> b -> Maybe c
f (OrdKey k -> a -> b -> Maybe c)
-> (k -> OrdKey k) -> k -> a -> b -> Maybe c
forall b c a. (b -> c) -> (a -> b) -> a -> c
. k -> OrdKey k
forall k. k -> OrdKey k
OrdKey) ((Trie (OrdKey k) a -> Trie (OrdKey k) c) -> Map k a -> Map k c
forall a b. Coercible a b => a -> b
coerce Trie (OrdKey k) a -> Trie (OrdKey k) c
g) ((Trie (OrdKey k) b -> Trie (OrdKey k) c) -> Map k b -> Map k c
forall a b. Coercible a b => a -> b
coerce Trie (OrdKey k) b -> Trie (OrdKey k) c
h) Map k a
TrieRep (OrdKey k) a
x Map k b
TrieRep (OrdKey k) b
y)
{-# INLINABLE trieEmpty #-}
{-# INLINABLE trieInsert #-}
{-# INLINABLE trieLookup #-}
{-# INLINABLE trieDelete #-}
{-# INLINABLE trieSingleton #-}
{-# INLINABLE trieFoldWithKey #-}
{-# INLINABLE trieShowsPrec #-}
{-# INLINABLE trieTraverse #-}
{-# INLINABLE trieTraverseWithKey #-}
{-# INLINABLE trieNull #-}
{-# INLINABLE trieMap #-}
{-# INLINABLE trieMergeWithKey #-}
{-# INLINABLE trieMapMaybeWithKey #-}
instance TrieKey ()
instance TrieKey Bool
instance TrieKey k => TrieKey (Maybe k)
instance (TrieKey a, TrieKey b) => TrieKey (Either a b)
instance (TrieKey a, TrieKey b) => TrieKey (a,b)
instance (TrieKey a, TrieKey b, TrieKey c) => TrieKey (a,b,c)
instance (TrieKey a, TrieKey b, TrieKey c, TrieKey d) => TrieKey (a,b,c,d)
instance (TrieKey a, TrieKey b, TrieKey c, TrieKey d, TrieKey e) => TrieKey (a,b,c,d,e)
instance TrieKey k => TrieKey [k]
genericLookup ::
( GTrieKey (Rep k), Generic k
, TrieRep k ~ TrieRepDefault k
) =>
k -> Trie k a -> Maybe a
genericLookup :: k -> Trie k a -> Maybe a
genericLookup k :: k
k t :: Trie k a
t = Rep k Any -> GTrie (Rep k) a -> Maybe a
forall (f :: * -> *) p a. GTrieKey f => f p -> GTrie f a -> Maybe a
gtrieLookup (k -> Rep k Any
forall a x. Generic a => a -> Rep a x
from k
k) (GTrie (Rep k) a -> Maybe a) -> Maybe (GTrie (Rep k) a) -> Maybe a
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Trie k a -> Maybe (GTrie (Rep k) a)
forall t t2 t1.
(TrieRep t ~ TrieRepDefault t2) =>
Trie t t1 -> Maybe (GTrie (Rep t2) t1)
unwrap Trie k a
t
{-# INLINABLE genericLookup #-}
genericTrieNull ::
( TrieRep k ~ TrieRepDefault k
) =>
Trie k a -> Bool
genericTrieNull :: Trie k a -> Bool
genericTrieNull = Maybe (GTrie (Rep k) a) -> Bool
forall a. Maybe a -> Bool
isNothing (Maybe (GTrie (Rep k) a) -> Bool)
-> (Trie k a -> Maybe (GTrie (Rep k) a)) -> Trie k a -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Trie k a -> Maybe (GTrie (Rep k) a)
forall t t2 t1.
(TrieRep t ~ TrieRepDefault t2) =>
Trie t t1 -> Maybe (GTrie (Rep t2) t1)
unwrap
{-# INLINABLE genericTrieNull #-}
genericSingleton ::
( GTrieKey (Rep k), Generic k
, TrieRep k ~ TrieRepDefault k
) =>
k -> a -> Trie k a
genericSingleton :: k -> a -> Trie k a
genericSingleton k :: k
k v :: a
v = Maybe (GTrie (Rep k) a) -> Trie k a
forall k k1 a.
(TrieRep k ~ TrieRepDefault k1) =>
Maybe (GTrie (Rep k1) a) -> Trie k a
wrap (Maybe (GTrie (Rep k) a) -> Trie k a)
-> Maybe (GTrie (Rep k) a) -> Trie k a
forall a b. (a -> b) -> a -> b
$ GTrie (Rep k) a -> Maybe (GTrie (Rep k) a)
forall a. a -> Maybe a
Just (GTrie (Rep k) a -> Maybe (GTrie (Rep k) a))
-> GTrie (Rep k) a -> Maybe (GTrie (Rep k) a)
forall a b. (a -> b) -> a -> b
$! Rep k Any -> a -> GTrie (Rep k) a
forall (f :: * -> *) p a. GTrieKey f => f p -> a -> GTrie f a
gtrieSingleton (k -> Rep k Any
forall a x. Generic a => a -> Rep a x
from k
k) a
v
{-# INLINABLE genericSingleton #-}
genericEmpty ::
( TrieRep k ~ TrieRepDefault k
) =>
Trie k a
genericEmpty :: Trie k a
genericEmpty = TrieRep k a -> Trie k a
forall k a. TrieRep k a -> Trie k a
MkTrie TrieRep k a
forall k a. TrieRepDefault k a
EmptyTrie
{-# INLINABLE genericEmpty #-}
genericInsert ::
( GTrieKey (Rep k), Generic k
, TrieRep k ~ TrieRepDefault k
) =>
k -> a -> Trie k a -> Trie k a
genericInsert :: k -> a -> Trie k a -> Trie k a
genericInsert k :: k
k v :: a
v m :: Trie k a
m = Maybe (GTrie (Rep k) a) -> Trie k a
forall k k1 a.
(TrieRep k ~ TrieRepDefault k1) =>
Maybe (GTrie (Rep k1) a) -> Trie k a
wrap (Maybe (GTrie (Rep k) a) -> Trie k a)
-> Maybe (GTrie (Rep k) a) -> Trie k a
forall a b. (a -> b) -> a -> b
$
case Trie k a -> Maybe (GTrie (Rep k) a)
forall t t2 t1.
(TrieRep t ~ TrieRepDefault t2) =>
Trie t t1 -> Maybe (GTrie (Rep t2) t1)
unwrap Trie k a
m of
Nothing -> GTrie (Rep k) a -> Maybe (GTrie (Rep k) a)
forall a. a -> Maybe a
Just (GTrie (Rep k) a -> Maybe (GTrie (Rep k) a))
-> GTrie (Rep k) a -> Maybe (GTrie (Rep k) a)
forall a b. (a -> b) -> a -> b
$! Rep k Any -> a -> GTrie (Rep k) a
forall (f :: * -> *) p a. GTrieKey f => f p -> a -> GTrie f a
gtrieSingleton (k -> Rep k Any
forall a x. Generic a => a -> Rep a x
from k
k) a
v
Just t :: GTrie (Rep k) a
t -> GTrie (Rep k) a -> Maybe (GTrie (Rep k) a)
forall a. a -> Maybe a
Just (GTrie (Rep k) a -> Maybe (GTrie (Rep k) a))
-> GTrie (Rep k) a -> Maybe (GTrie (Rep k) a)
forall a b. (a -> b) -> a -> b
$! Rep k Any -> a -> GTrie (Rep k) a -> GTrie (Rep k) a
forall (f :: * -> *) p a.
GTrieKey f =>
f p -> a -> GTrie f a -> GTrie f a
gtrieInsert (k -> Rep k Any
forall a x. Generic a => a -> Rep a x
from k
k) a
v GTrie (Rep k) a
t
{-# INLINABLE genericInsert #-}
genericDelete ::
( GTrieKey (Rep k), Generic k
, TrieRep k ~ TrieRepDefault k
) =>
k -> Trie k a -> Trie k a
genericDelete :: k -> Trie k a -> Trie k a
genericDelete k :: k
k m :: Trie k a
m = Maybe (GTrie (Rep k) a) -> Trie k a
forall k k1 a.
(TrieRep k ~ TrieRepDefault k1) =>
Maybe (GTrie (Rep k1) a) -> Trie k a
wrap (Rep k Any -> GTrie (Rep k) a -> Maybe (GTrie (Rep k) a)
forall (f :: * -> *) p a.
GTrieKey f =>
f p -> GTrie f a -> Maybe (GTrie f a)
gtrieDelete (k -> Rep k Any
forall a x. Generic a => a -> Rep a x
from k
k) (GTrie (Rep k) a -> Maybe (GTrie (Rep k) a))
-> Maybe (GTrie (Rep k) a) -> Maybe (GTrie (Rep k) a)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Trie k a -> Maybe (GTrie (Rep k) a)
forall t t2 t1.
(TrieRep t ~ TrieRepDefault t2) =>
Trie t t1 -> Maybe (GTrie (Rep t2) t1)
unwrap Trie k a
m)
{-# INLINABLE genericDelete #-}
genericTrieMap ::
( GTrieKey (Rep k)
, TrieRep k ~ TrieRepDefault k
) =>
(a -> b) -> Trie k a -> Trie k b
genericTrieMap :: (a -> b) -> Trie k a -> Trie k b
genericTrieMap f :: a -> b
f x :: Trie k a
x = Maybe (GTrie (Rep k) b) -> Trie k b
forall k k1 a.
(TrieRep k ~ TrieRepDefault k1) =>
Maybe (GTrie (Rep k1) a) -> Trie k a
wrap ((GTrie (Rep k) a -> GTrie (Rep k) b)
-> Maybe (GTrie (Rep k) a) -> Maybe (GTrie (Rep k) b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((a -> b) -> GTrie (Rep k) a -> GTrie (Rep k) b
forall (f :: * -> *) a b.
GTrieKey f =>
(a -> b) -> GTrie f a -> GTrie f b
gtrieMap a -> b
f) (Maybe (GTrie (Rep k) a) -> Maybe (GTrie (Rep k) b))
-> Maybe (GTrie (Rep k) a) -> Maybe (GTrie (Rep k) b)
forall a b. (a -> b) -> a -> b
$! Trie k a -> Maybe (GTrie (Rep k) a)
forall t t2 t1.
(TrieRep t ~ TrieRepDefault t2) =>
Trie t t1 -> Maybe (GTrie (Rep t2) t1)
unwrap Trie k a
x)
{-# INLINABLE genericTrieMap #-}
genericTrieTraverse ::
( GTrieKey (Rep k)
, TrieRep k ~ TrieRepDefault k
, Applicative f
) =>
(a -> f b) -> Trie k a -> f (Trie k b)
genericTrieTraverse :: (a -> f b) -> Trie k a -> f (Trie k b)
genericTrieTraverse f :: a -> f b
f x :: Trie k a
x =
(Maybe (GTrie (Rep k) b) -> Trie k b)
-> f (Maybe (GTrie (Rep k) b)) -> f (Trie k b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Maybe (GTrie (Rep k) b) -> Trie k b
forall k k1 a.
(TrieRep k ~ TrieRepDefault k1) =>
Maybe (GTrie (Rep k1) a) -> Trie k a
wrap ((GTrie (Rep k) a -> f (GTrie (Rep k) b))
-> Maybe (GTrie (Rep k) a) -> f (Maybe (GTrie (Rep k) b))
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse ((a -> f b) -> GTrie (Rep k) a -> f (GTrie (Rep k) b)
forall (f :: * -> *) (m :: * -> *) a b.
(GTrieKey f, Applicative m) =>
(a -> m b) -> GTrie f a -> m (GTrie f b)
gtrieTraverse a -> f b
f) (Trie k a -> Maybe (GTrie (Rep k) a)
forall t t2 t1.
(TrieRep t ~ TrieRepDefault t2) =>
Trie t t1 -> Maybe (GTrie (Rep t2) t1)
unwrap Trie k a
x))
{-# INLINABLE genericTrieTraverse #-}
genericTrieShowsPrec ::
( Show a, GTrieKeyShow (Rep k)
, TrieRep k ~ TrieRepDefault k
) =>
Int -> Trie k a -> ShowS
genericTrieShowsPrec :: Int -> Trie k a -> ShowS
genericTrieShowsPrec p :: Int
p m :: Trie k a
m =
case Trie k a -> Maybe (GTrie (Rep k) a)
forall t t2 t1.
(TrieRep t ~ TrieRepDefault t2) =>
Trie t t1 -> Maybe (GTrie (Rep t2) t1)
unwrap Trie k a
m of
Just x :: GTrie (Rep k) a
x -> Int -> GTrie (Rep k) a -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
p GTrie (Rep k) a
x
Nothing -> String -> ShowS
showString "()"
{-# INLINABLE genericTrieShowsPrec #-}
genericMapMaybeWithKey ::
( GTrieKey (Rep k), Generic k
, TrieRep k ~ TrieRepDefault k
) =>
(k -> a -> Maybe b) -> Trie k a -> Trie k b
genericMapMaybeWithKey :: (k -> a -> Maybe b) -> Trie k a -> Trie k b
genericMapMaybeWithKey f :: k -> a -> Maybe b
f x :: Trie k a
x = Maybe (GTrie (Rep k) b) -> Trie k b
forall k k1 a.
(TrieRep k ~ TrieRepDefault k1) =>
Maybe (GTrie (Rep k1) a) -> Trie k a
wrap ((Rep k Any -> a -> Maybe b)
-> GTrie (Rep k) a -> Maybe (GTrie (Rep k) b)
forall (f :: * -> *) p a b.
GTrieKey f =>
(f p -> a -> Maybe b) -> GTrie f a -> Maybe (GTrie f b)
gmapMaybeWithKey (k -> a -> Maybe b
f (k -> a -> Maybe b)
-> (Rep k Any -> k) -> Rep k Any -> a -> Maybe b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rep k Any -> k
forall a x. Generic a => Rep a x -> a
to) (GTrie (Rep k) a -> Maybe (GTrie (Rep k) b))
-> Maybe (GTrie (Rep k) a) -> Maybe (GTrie (Rep k) b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Trie k a -> Maybe (GTrie (Rep k) a)
forall t t2 t1.
(TrieRep t ~ TrieRepDefault t2) =>
Trie t t1 -> Maybe (GTrie (Rep t2) t1)
unwrap Trie k a
x)
{-# INLINABLE genericMapMaybeWithKey #-}
genericFoldWithKey ::
( GTrieKey (Rep k), Generic k
, TrieRep k ~ TrieRepDefault k
) =>
(k -> a -> r -> r) -> r -> Trie k a -> r
genericFoldWithKey :: (k -> a -> r -> r) -> r -> Trie k a -> r
genericFoldWithKey f :: k -> a -> r -> r
f z :: r
z m :: Trie k a
m =
case Trie k a -> Maybe (GTrie (Rep k) a)
forall t t2 t1.
(TrieRep t ~ TrieRepDefault t2) =>
Trie t t1 -> Maybe (GTrie (Rep t2) t1)
unwrap Trie k a
m of
Nothing -> r
z
Just x :: GTrie (Rep k) a
x -> (Rep k Any -> a -> r -> r) -> r -> GTrie (Rep k) a -> r
forall (f :: * -> *) p a r.
GTrieKey f =>
(f p -> a -> r -> r) -> r -> GTrie f a -> r
gfoldWithKey (k -> a -> r -> r
f (k -> a -> r -> r) -> (Rep k Any -> k) -> Rep k Any -> a -> r -> r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rep k Any -> k
forall a x. Generic a => Rep a x -> a
to) r
z GTrie (Rep k) a
x
{-# INLINABLE genericFoldWithKey #-}
genericTraverseWithKey ::
( GTrieKey (Rep k), Generic k
, TrieRep k ~ TrieRepDefault k
, Applicative f
) =>
(k -> a -> f b) -> Trie k a -> f (Trie k b)
genericTraverseWithKey :: (k -> a -> f b) -> Trie k a -> f (Trie k b)
genericTraverseWithKey f :: k -> a -> f b
f m :: Trie k a
m = (Maybe (GTrie (Rep k) b) -> Trie k b)
-> f (Maybe (GTrie (Rep k) b)) -> f (Trie k b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Maybe (GTrie (Rep k) b) -> Trie k b
forall k k1 a.
(TrieRep k ~ TrieRepDefault k1) =>
Maybe (GTrie (Rep k1) a) -> Trie k a
wrap ((GTrie (Rep k) a -> f (GTrie (Rep k) b))
-> Maybe (GTrie (Rep k) a) -> f (Maybe (GTrie (Rep k) b))
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse ((Rep k Any -> a -> f b) -> GTrie (Rep k) a -> f (GTrie (Rep k) b)
forall (f :: * -> *) (m :: * -> *) p a b.
(GTrieKey f, Applicative m) =>
(f p -> a -> m b) -> GTrie f a -> m (GTrie f b)
gtraverseWithKey (k -> a -> f b
f (k -> a -> f b) -> (Rep k Any -> k) -> Rep k Any -> a -> f b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rep k Any -> k
forall a x. Generic a => Rep a x -> a
to)) (Trie k a -> Maybe (GTrie (Rep k) a)
forall t t2 t1.
(TrieRep t ~ TrieRepDefault t2) =>
Trie t t1 -> Maybe (GTrie (Rep t2) t1)
unwrap Trie k a
m))
{-# INLINABLE genericTraverseWithKey #-}
genericMergeWithKey ::
( GTrieKey (Rep k), Generic k
, TrieRep k ~ TrieRepDefault k
) =>
(k -> a -> b -> Maybe c) -> (Trie k a -> Trie k c) -> (Trie k b -> Trie k c) ->
Trie k a -> Trie k b -> Trie k c
genericMergeWithKey :: (k -> a -> b -> Maybe c)
-> (Trie k a -> Trie k c)
-> (Trie k b -> Trie k c)
-> Trie k a
-> Trie k b
-> Trie k c
genericMergeWithKey f :: k -> a -> b -> Maybe c
f g :: Trie k a -> Trie k c
g h :: Trie k b -> Trie k c
h (MkTrie x :: TrieRep k a
x) (MkTrie y :: TrieRep k b
y) =
case (TrieRepDefault k a
TrieRep k a
x,TrieRepDefault k b
TrieRep k b
y) of
(EmptyTrie, EmptyTrie) -> TrieRep k c -> Trie k c
forall k a. TrieRep k a -> Trie k a
MkTrie TrieRep k c
forall k a. TrieRepDefault k a
EmptyTrie
(NonEmptyTrie{} , EmptyTrie) -> Trie k a -> Trie k c
g (TrieRep k a -> Trie k a
forall k a. TrieRep k a -> Trie k a
MkTrie TrieRep k a
x)
(EmptyTrie, NonEmptyTrie{} ) -> Trie k b -> Trie k c
h (TrieRep k b -> Trie k b
forall k a. TrieRep k a -> Trie k a
MkTrie TrieRep k b
y)
(NonEmptyTrie x' :: GTrie (Rep k) a
x', NonEmptyTrie y' :: GTrie (Rep k) b
y') -> Maybe (GTrie (Rep k) c) -> Trie k c
forall k k1 a.
(TrieRep k ~ TrieRepDefault k1) =>
Maybe (GTrie (Rep k1) a) -> Trie k a
wrap ((Rep k Any -> a -> b -> Maybe c)
-> (GTrie (Rep k) a -> Maybe (GTrie (Rep k) c))
-> (GTrie (Rep k) b -> Maybe (GTrie (Rep k) c))
-> GTrie (Rep k) a
-> GTrie (Rep k) b
-> Maybe (GTrie (Rep k) c)
forall (f :: * -> *) p a b c.
GTrieKey f =>
(f p -> a -> b -> Maybe c)
-> (GTrie f a -> Maybe (GTrie f c))
-> (GTrie f b -> Maybe (GTrie f c))
-> GTrie f a
-> GTrie f b
-> Maybe (GTrie f c)
gmergeWithKey (k -> a -> b -> Maybe c
f (k -> a -> b -> Maybe c)
-> (Rep k Any -> k) -> Rep k Any -> a -> b -> Maybe c
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rep k Any -> k
forall a x. Generic a => Rep a x -> a
to) ((Trie k a -> Trie k c)
-> GTrie (Rep k) a -> Maybe (GTrie (Rep k) c)
forall t t2 k k a t1.
(TrieRep t ~ TrieRepDefault t2, TrieRep k ~ TrieRepDefault k) =>
(Trie k a -> Trie t t1)
-> GTrie (Rep k) a -> Maybe (GTrie (Rep t2) t1)
aux Trie k a -> Trie k c
g) ((Trie k b -> Trie k c)
-> GTrie (Rep k) b -> Maybe (GTrie (Rep k) c)
forall t t2 k k a t1.
(TrieRep t ~ TrieRepDefault t2, TrieRep k ~ TrieRepDefault k) =>
(Trie k a -> Trie t t1)
-> GTrie (Rep k) a -> Maybe (GTrie (Rep t2) t1)
aux Trie k b -> Trie k c
h) GTrie (Rep k) a
x' GTrie (Rep k) b
y')
where
aux :: (Trie k a -> Trie t t1)
-> GTrie (Rep k) a -> Maybe (GTrie (Rep t2) t1)
aux k :: Trie k a -> Trie t t1
k t :: GTrie (Rep k) a
t = Trie t t1 -> Maybe (GTrie (Rep t2) t1)
forall t t2 t1.
(TrieRep t ~ TrieRepDefault t2) =>
Trie t t1 -> Maybe (GTrie (Rep t2) t1)
unwrap (Trie k a -> Trie t t1
k (TrieRep k a -> Trie k a
forall k a. TrieRep k a -> Trie k a
MkTrie (GTrie (Rep k) a -> TrieRepDefault k a
forall k a. GTrie (Rep k) a -> TrieRepDefault k a
NonEmptyTrie GTrie (Rep k) a
t)))
{-# INLINABLE genericMergeWithKey #-}
wrap :: TrieRep k ~ TrieRepDefault k1 => Maybe (GTrie (Rep k1) a) -> Trie k a
wrap :: Maybe (GTrie (Rep k1) a) -> Trie k a
wrap Nothing = TrieRep k a -> Trie k a
forall k a. TrieRep k a -> Trie k a
MkTrie TrieRep k a
forall k a. TrieRepDefault k a
EmptyTrie
wrap (Just t :: GTrie (Rep k1) a
t) = TrieRep k a -> Trie k a
forall k a. TrieRep k a -> Trie k a
MkTrie (GTrie (Rep k1) a -> TrieRepDefault k1 a
forall k a. GTrie (Rep k) a -> TrieRepDefault k a
NonEmptyTrie GTrie (Rep k1) a
t)
unwrap :: TrieRep t ~ TrieRepDefault t2 => Trie t t1 -> Maybe (GTrie (Rep t2) t1)
unwrap :: Trie t t1 -> Maybe (GTrie (Rep t2) t1)
unwrap (MkTrie EmptyTrie) = Maybe (GTrie (Rep t2) t1)
forall a. Maybe a
Nothing
unwrap (MkTrie (NonEmptyTrie t)) = GTrie (Rep t2) t1 -> Maybe (GTrie (Rep t2) t1)
forall a. a -> Maybe a
Just GTrie (Rep t2) t1
t
data TrieRepDefault k a = EmptyTrie | NonEmptyTrie !(GTrie (Rep k) a)
data family GTrie (f :: * -> *) a
newtype instance GTrie (M1 i c f) a = MTrie (GTrie f a)
data instance GTrie (f :+: g) a = STrieL !(GTrie f a)
| STrieR !(GTrie g a)
| STrieB !(GTrie f a) !(GTrie g a)
newtype instance GTrie (f :*: g) a = PTrie (GTrie f (GTrie g a))
newtype instance GTrie (K1 i k) a = KTrie (Trie k a)
newtype instance GTrie U1 a = UTrie a
data instance GTrie V1 a
instance GTrieKey f => Functor (GTrie f) where
fmap :: (a -> b) -> GTrie f a -> GTrie f b
fmap = (a -> b) -> GTrie f a -> GTrie f b
forall (f :: * -> *) a b.
GTrieKey f =>
(a -> b) -> GTrie f a -> GTrie f b
gtrieMap
class GTrieKey f where
gtrieLookup :: f p -> GTrie f a -> Maybe a
gtrieInsert :: f p -> a -> GTrie f a -> GTrie f a
gtrieSingleton :: f p -> a -> GTrie f a
gtrieDelete :: f p -> GTrie f a -> Maybe (GTrie f a)
gtrieMap :: (a -> b) -> GTrie f a -> GTrie f b
gtrieTraverse :: Applicative m => (a -> m b) -> GTrie f a -> m (GTrie f b)
gmapMaybeWithKey :: (f p -> a -> Maybe b) -> GTrie f a -> Maybe (GTrie f b)
gfoldWithKey :: (f p -> a -> r -> r) -> r -> GTrie f a -> r
gtraverseWithKey :: Applicative m => (f p -> a -> m b) -> GTrie f a -> m (GTrie f b)
gmergeWithKey :: (f p -> a -> b -> Maybe c) ->
(GTrie f a -> Maybe (GTrie f c)) ->
(GTrie f b -> Maybe (GTrie f c)) ->
GTrie f a -> GTrie f b -> Maybe (GTrie f c)
class GTrieKeyShow f where
gtrieShowsPrec :: Show a => Int -> GTrie f a -> ShowS
instance GTrieKey f => GTrieKey (M1 i c f) where
gtrieLookup :: M1 i c f p -> GTrie (M1 i c f) a -> Maybe a
gtrieLookup (M1 k :: f p
k) (MTrie x) = f p -> GTrie f a -> Maybe a
forall (f :: * -> *) p a. GTrieKey f => f p -> GTrie f a -> Maybe a
gtrieLookup f p
k GTrie f a
x
gtrieInsert :: M1 i c f p -> a -> GTrie (M1 i c f) a -> GTrie (M1 i c f) a
gtrieInsert (M1 k :: f p
k) v :: a
v (MTrie t)= GTrie f a -> GTrie (M1 i c f) a
forall i (c :: Meta) (f :: * -> *) a.
GTrie f a -> GTrie (M1 i c f) a
MTrie (f p -> a -> GTrie f a -> GTrie f a
forall (f :: * -> *) p a.
GTrieKey f =>
f p -> a -> GTrie f a -> GTrie f a
gtrieInsert f p
k a
v GTrie f a
t)
gtrieSingleton :: M1 i c f p -> a -> GTrie (M1 i c f) a
gtrieSingleton (M1 k :: f p
k) v :: a
v = GTrie f a -> GTrie (M1 i c f) a
forall i (c :: Meta) (f :: * -> *) a.
GTrie f a -> GTrie (M1 i c f) a
MTrie (f p -> a -> GTrie f a
forall (f :: * -> *) p a. GTrieKey f => f p -> a -> GTrie f a
gtrieSingleton f p
k a
v)
gtrieDelete :: M1 i c f p -> GTrie (M1 i c f) a -> Maybe (GTrie (M1 i c f) a)
gtrieDelete (M1 k :: f p
k) (MTrie x) = (GTrie f a -> GTrie (M1 i c f) a)
-> Maybe (GTrie f a) -> Maybe (GTrie (M1 i c f) a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap GTrie f a -> GTrie (M1 i c f) a
forall i (c :: Meta) (f :: * -> *) a.
GTrie f a -> GTrie (M1 i c f) a
MTrie (f p -> GTrie f a -> Maybe (GTrie f a)
forall (f :: * -> *) p a.
GTrieKey f =>
f p -> GTrie f a -> Maybe (GTrie f a)
gtrieDelete f p
k GTrie f a
x)
gtrieMap :: (a -> b) -> GTrie (M1 i c f) a -> GTrie (M1 i c f) b
gtrieMap f :: a -> b
f (MTrie x) = GTrie f b -> GTrie (M1 i c f) b
forall i (c :: Meta) (f :: * -> *) a.
GTrie f a -> GTrie (M1 i c f) a
MTrie ((a -> b) -> GTrie f a -> GTrie f b
forall (f :: * -> *) a b.
GTrieKey f =>
(a -> b) -> GTrie f a -> GTrie f b
gtrieMap a -> b
f GTrie f a
x)
gtrieTraverse :: (a -> m b) -> GTrie (M1 i c f) a -> m (GTrie (M1 i c f) b)
gtrieTraverse f :: a -> m b
f (MTrie x) = (GTrie f b -> GTrie (M1 i c f) b)
-> m (GTrie f b) -> m (GTrie (M1 i c f) b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap GTrie f b -> GTrie (M1 i c f) b
forall i (c :: Meta) (f :: * -> *) a.
GTrie f a -> GTrie (M1 i c f) a
MTrie ((a -> m b) -> GTrie f a -> m (GTrie f b)
forall (f :: * -> *) (m :: * -> *) a b.
(GTrieKey f, Applicative m) =>
(a -> m b) -> GTrie f a -> m (GTrie f b)
gtrieTraverse a -> m b
f GTrie f a
x)
gmapMaybeWithKey :: (M1 i c f p -> a -> Maybe b)
-> GTrie (M1 i c f) a -> Maybe (GTrie (M1 i c f) b)
gmapMaybeWithKey f :: M1 i c f p -> a -> Maybe b
f (MTrie x) = (GTrie f b -> GTrie (M1 i c f) b)
-> Maybe (GTrie f b) -> Maybe (GTrie (M1 i c f) b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap GTrie f b -> GTrie (M1 i c f) b
forall i (c :: Meta) (f :: * -> *) a.
GTrie f a -> GTrie (M1 i c f) a
MTrie ((f p -> a -> Maybe b) -> GTrie f a -> Maybe (GTrie f b)
forall (f :: * -> *) p a b.
GTrieKey f =>
(f p -> a -> Maybe b) -> GTrie f a -> Maybe (GTrie f b)
gmapMaybeWithKey (M1 i c f p -> a -> Maybe b
f (M1 i c f p -> a -> Maybe b)
-> (f p -> M1 i c f p) -> f p -> a -> Maybe b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. f p -> M1 i c f p
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1) GTrie f a
x)
gfoldWithKey :: (M1 i c f p -> a -> r -> r) -> r -> GTrie (M1 i c f) a -> r
gfoldWithKey f :: M1 i c f p -> a -> r -> r
f z :: r
z (MTrie x) = (f p -> a -> r -> r) -> r -> GTrie f a -> r
forall (f :: * -> *) p a r.
GTrieKey f =>
(f p -> a -> r -> r) -> r -> GTrie f a -> r
gfoldWithKey (M1 i c f p -> a -> r -> r
f (M1 i c f p -> a -> r -> r)
-> (f p -> M1 i c f p) -> f p -> a -> r -> r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. f p -> M1 i c f p
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1) r
z GTrie f a
x
gtraverseWithKey :: (M1 i c f p -> a -> m b)
-> GTrie (M1 i c f) a -> m (GTrie (M1 i c f) b)
gtraverseWithKey f :: M1 i c f p -> a -> m b
f (MTrie x) = (GTrie f b -> GTrie (M1 i c f) b)
-> m (GTrie f b) -> m (GTrie (M1 i c f) b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap GTrie f b -> GTrie (M1 i c f) b
forall i (c :: Meta) (f :: * -> *) a.
GTrie f a -> GTrie (M1 i c f) a
MTrie ((f p -> a -> m b) -> GTrie f a -> m (GTrie f b)
forall (f :: * -> *) (m :: * -> *) p a b.
(GTrieKey f, Applicative m) =>
(f p -> a -> m b) -> GTrie f a -> m (GTrie f b)
gtraverseWithKey (M1 i c f p -> a -> m b
f (M1 i c f p -> a -> m b) -> (f p -> M1 i c f p) -> f p -> a -> m b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. f p -> M1 i c f p
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1) GTrie f a
x)
gmergeWithKey :: (M1 i c f p -> a -> b -> Maybe c)
-> (GTrie (M1 i c f) a -> Maybe (GTrie (M1 i c f) c))
-> (GTrie (M1 i c f) b -> Maybe (GTrie (M1 i c f) c))
-> GTrie (M1 i c f) a
-> GTrie (M1 i c f) b
-> Maybe (GTrie (M1 i c f) c)
gmergeWithKey f :: M1 i c f p -> a -> b -> Maybe c
f g :: GTrie (M1 i c f) a -> Maybe (GTrie (M1 i c f) c)
g h :: GTrie (M1 i c f) b -> Maybe (GTrie (M1 i c f) c)
h (MTrie x) (MTrie y) = (GTrie f c -> GTrie (M1 i c f) c)
-> Maybe (GTrie f c) -> Maybe (GTrie (M1 i c f) c)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap GTrie f c -> GTrie (M1 i c f) c
forall i (c :: Meta) (f :: * -> *) a.
GTrie f a -> GTrie (M1 i c f) a
MTrie ((f p -> a -> b -> Maybe c)
-> (GTrie f a -> Maybe (GTrie f c))
-> (GTrie f b -> Maybe (GTrie f c))
-> GTrie f a
-> GTrie f b
-> Maybe (GTrie f c)
forall (f :: * -> *) p a b c.
GTrieKey f =>
(f p -> a -> b -> Maybe c)
-> (GTrie f a -> Maybe (GTrie f c))
-> (GTrie f b -> Maybe (GTrie f c))
-> GTrie f a
-> GTrie f b
-> Maybe (GTrie f c)
gmergeWithKey (M1 i c f p -> a -> b -> Maybe c
f (M1 i c f p -> a -> b -> Maybe c)
-> (f p -> M1 i c f p) -> f p -> a -> b -> Maybe c
forall b c a. (b -> c) -> (a -> b) -> a -> c
. f p -> M1 i c f p
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1) ((GTrie (M1 i c f) a -> Maybe (GTrie (M1 i c f) c))
-> GTrie f a -> Maybe (GTrie f c)
forall a b. Coercible a b => a -> b
coerce GTrie (M1 i c f) a -> Maybe (GTrie (M1 i c f) c)
g) ((GTrie (M1 i c f) b -> Maybe (GTrie (M1 i c f) c))
-> GTrie f b -> Maybe (GTrie f c)
forall a b. Coercible a b => a -> b
coerce GTrie (M1 i c f) b -> Maybe (GTrie (M1 i c f) c)
h) GTrie f a
x GTrie f b
y)
{-# INLINE gtrieLookup #-}
{-# INLINE gtrieInsert #-}
{-# INLINE gtrieSingleton #-}
{-# INLINE gtrieDelete #-}
{-# INLINE gtrieMap #-}
{-# INLINE gmapMaybeWithKey #-}
{-# INLINE gtrieTraverse #-}
{-# INLINE gfoldWithKey #-}
{-# INLINE gtraverseWithKey #-}
#if MIN_VERSION_base(4,9,0)
data MProxy (c :: Meta) (f :: * -> *) a = MProxy
#else
data MProxy (c :: *) (f :: * -> *) a = MProxy
#endif
instance GTrieKeyShow f => GTrieKeyShow (M1 D d f) where
gtrieShowsPrec :: Int -> GTrie (M1 D d f) a -> ShowS
gtrieShowsPrec p :: Int
p (MTrie x) = Int -> GTrie f a -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
p GTrie f a
x
instance (Constructor c, GTrieKeyShow f) => GTrieKeyShow (M1 C c f) where
gtrieShowsPrec :: Int -> GTrie (M1 C c f) a -> ShowS
gtrieShowsPrec p :: Int
p (MTrie x) = Bool -> ShowS -> ShowS
showParen (Int
p Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> 10)
(ShowS -> ShowS) -> ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ String -> ShowS
showString "Con "
ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ShowS
forall a. Show a => a -> ShowS
shows (MProxy c f () -> String
forall k (c :: k) k1 (t :: k -> (k1 -> *) -> k1 -> *)
(f :: k1 -> *) (a :: k1).
Constructor c =>
t c f a -> String
conName (MProxy c f ()
forall (c :: Meta) (f :: * -> *) a. MProxy c f a
MProxy :: MProxy c f ()))
ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ShowS
showString " "
ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> GTrie f a -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec 11 GTrie f a
x
instance GTrieKeyShow f => GTrieKeyShow (M1 S s f) where
gtrieShowsPrec :: Int -> GTrie (M1 S s f) a -> ShowS
gtrieShowsPrec p :: Int
p (MTrie x) = Int -> GTrie f a -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
p GTrie f a
x
checkNull :: TrieKey k => Trie k a -> Maybe (Trie k a)
checkNull :: Trie k a -> Maybe (Trie k a)
checkNull x :: Trie k a
x
| Trie k a -> Bool
forall k a. TrieKey k => Trie k a -> Bool
trieNull Trie k a
x = Maybe (Trie k a)
forall a. Maybe a
Nothing
| Bool
otherwise = Trie k a -> Maybe (Trie k a)
forall a. a -> Maybe a
Just Trie k a
x
instance TrieKey k => GTrieKey (K1 i k) where
gtrieLookup :: K1 i k p -> GTrie (K1 i k) a -> Maybe a
gtrieLookup (K1 k :: k
k) (KTrie x) = k -> Trie k a -> Maybe a
forall k a. TrieKey k => k -> Trie k a -> Maybe a
trieLookup k
k Trie k a
x
gtrieInsert :: K1 i k p -> a -> GTrie (K1 i k) a -> GTrie (K1 i k) a
gtrieInsert (K1 k :: k
k) v :: a
v (KTrie t) = Trie k a -> GTrie (K1 i k) a
forall i k a. Trie k a -> GTrie (K1 i k) a
KTrie (k -> a -> Trie k a -> Trie k a
forall k a. TrieKey k => k -> a -> Trie k a -> Trie k a
trieInsert k
k a
v Trie k a
t)
gtrieSingleton :: K1 i k p -> a -> GTrie (K1 i k) a
gtrieSingleton (K1 k :: k
k) v :: a
v = Trie k a -> GTrie (K1 i k) a
forall i k a. Trie k a -> GTrie (K1 i k) a
KTrie (k -> a -> Trie k a
forall k a. TrieKey k => k -> a -> Trie k a
trieSingleton k
k a
v)
gtrieDelete :: K1 i k p -> GTrie (K1 i k) a -> Maybe (GTrie (K1 i k) a)
gtrieDelete (K1 k :: k
k) (KTrie t) = (Trie k a -> GTrie (K1 i k) a)
-> Maybe (Trie k a) -> Maybe (GTrie (K1 i k) a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Trie k a -> GTrie (K1 i k) a
forall i k a. Trie k a -> GTrie (K1 i k) a
KTrie (Trie k a -> Maybe (Trie k a)
forall k a. TrieKey k => Trie k a -> Maybe (Trie k a)
checkNull (k -> Trie k a -> Trie k a
forall k a. TrieKey k => k -> Trie k a -> Trie k a
trieDelete k
k Trie k a
t))
gtrieMap :: (a -> b) -> GTrie (K1 i k) a -> GTrie (K1 i k) b
gtrieMap f :: a -> b
f (KTrie x) = Trie k b -> GTrie (K1 i k) b
forall i k a. Trie k a -> GTrie (K1 i k) a
KTrie ((a -> b) -> Trie k a -> Trie k b
forall k a b. TrieKey k => (a -> b) -> Trie k a -> Trie k b
trieMap a -> b
f Trie k a
x)
gtrieTraverse :: (a -> m b) -> GTrie (K1 i k) a -> m (GTrie (K1 i k) b)
gtrieTraverse f :: a -> m b
f (KTrie x) = (Trie k b -> GTrie (K1 i k) b)
-> m (Trie k b) -> m (GTrie (K1 i k) b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Trie k b -> GTrie (K1 i k) b
forall i k a. Trie k a -> GTrie (K1 i k) a
KTrie ((a -> m b) -> Trie k a -> m (Trie k b)
forall k (f :: * -> *) a b.
(TrieKey k, Applicative f) =>
(a -> f b) -> Trie k a -> f (Trie k b)
trieTraverse a -> m b
f Trie k a
x)
gmapMaybeWithKey :: (K1 i k p -> a -> Maybe b)
-> GTrie (K1 i k) a -> Maybe (GTrie (K1 i k) b)
gmapMaybeWithKey f :: K1 i k p -> a -> Maybe b
f (KTrie x) = (Trie k b -> GTrie (K1 i k) b)
-> Maybe (Trie k b) -> Maybe (GTrie (K1 i k) b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Trie k b -> GTrie (K1 i k) b
forall i k a. Trie k a -> GTrie (K1 i k) a
KTrie (Trie k b -> Maybe (Trie k b)
forall k a. TrieKey k => Trie k a -> Maybe (Trie k a)
checkNull ((k -> a -> Maybe b) -> Trie k a -> Trie k b
forall k a b.
TrieKey k =>
(k -> a -> Maybe b) -> Trie k a -> Trie k b
trieMapMaybeWithKey (K1 i k p -> a -> Maybe b
f (K1 i k p -> a -> Maybe b) -> (k -> K1 i k p) -> k -> a -> Maybe b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. k -> K1 i k p
forall k i c (p :: k). c -> K1 i c p
K1) Trie k a
x))
gfoldWithKey :: (K1 i k p -> a -> r -> r) -> r -> GTrie (K1 i k) a -> r
gfoldWithKey f :: K1 i k p -> a -> r -> r
f z :: r
z (KTrie x) = (k -> a -> r -> r) -> r -> Trie k a -> r
forall k a r. TrieKey k => (k -> a -> r -> r) -> r -> Trie k a -> r
trieFoldWithKey (K1 i k p -> a -> r -> r
f (K1 i k p -> a -> r -> r) -> (k -> K1 i k p) -> k -> a -> r -> r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. k -> K1 i k p
forall k i c (p :: k). c -> K1 i c p
K1) r
z Trie k a
x
gtraverseWithKey :: (K1 i k p -> a -> m b) -> GTrie (K1 i k) a -> m (GTrie (K1 i k) b)
gtraverseWithKey f :: K1 i k p -> a -> m b
f (KTrie x) = (Trie k b -> GTrie (K1 i k) b)
-> m (Trie k b) -> m (GTrie (K1 i k) b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Trie k b -> GTrie (K1 i k) b
forall i k a. Trie k a -> GTrie (K1 i k) a
KTrie ((k -> a -> m b) -> Trie k a -> m (Trie k b)
forall k (f :: * -> *) a b.
(TrieKey k, Applicative f) =>
(k -> a -> f b) -> Trie k a -> f (Trie k b)
trieTraverseWithKey (K1 i k p -> a -> m b
f (K1 i k p -> a -> m b) -> (k -> K1 i k p) -> k -> a -> m b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. k -> K1 i k p
forall k i c (p :: k). c -> K1 i c p
K1) Trie k a
x)
gmergeWithKey :: (K1 i k p -> a -> b -> Maybe c)
-> (GTrie (K1 i k) a -> Maybe (GTrie (K1 i k) c))
-> (GTrie (K1 i k) b -> Maybe (GTrie (K1 i k) c))
-> GTrie (K1 i k) a
-> GTrie (K1 i k) b
-> Maybe (GTrie (K1 i k) c)
gmergeWithKey f :: K1 i k p -> a -> b -> Maybe c
f g :: GTrie (K1 i k) a -> Maybe (GTrie (K1 i k) c)
g h :: GTrie (K1 i k) b -> Maybe (GTrie (K1 i k) c)
h (KTrie x) (KTrie y) = (Trie k c -> GTrie (K1 i k) c)
-> Maybe (Trie k c) -> Maybe (GTrie (K1 i k) c)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Trie k c -> GTrie (K1 i k) c
forall i k a. Trie k a -> GTrie (K1 i k) a
KTrie (Trie k c -> Maybe (Trie k c)
forall k a. TrieKey k => Trie k a -> Maybe (Trie k a)
checkNull ((k -> a -> b -> Maybe c)
-> (Trie k a -> Trie k c)
-> (Trie k b -> Trie k c)
-> Trie k a
-> Trie k b
-> Trie k c
forall k a b c.
TrieKey k =>
(k -> a -> b -> Maybe c)
-> (Trie k a -> Trie k c)
-> (Trie k b -> Trie k c)
-> Trie k a
-> Trie k b
-> Trie k c
trieMergeWithKey (K1 i k p -> a -> b -> Maybe c
f (K1 i k p -> a -> b -> Maybe c)
-> (k -> K1 i k p) -> k -> a -> b -> Maybe c
forall b c a. (b -> c) -> (a -> b) -> a -> c
. k -> K1 i k p
forall k i c (p :: k). c -> K1 i c p
K1) Trie k a -> Trie k c
g' Trie k b -> Trie k c
h' Trie k a
x Trie k b
y))
where
g' :: Trie k a -> Trie k c
g' t :: Trie k a
t = case GTrie (K1 i k) a -> Maybe (GTrie (K1 i k) c)
g (Trie k a -> GTrie (K1 i k) a
forall i k a. Trie k a -> GTrie (K1 i k) a
KTrie Trie k a
t) of
Just (KTrie t') -> Trie k c
t'
Nothing -> Trie k c
forall k a. TrieKey k => Trie k a
trieEmpty
h' :: Trie k b -> Trie k c
h' t :: Trie k b
t = case GTrie (K1 i k) b -> Maybe (GTrie (K1 i k) c)
h (Trie k b -> GTrie (K1 i k) b
forall i k a. Trie k a -> GTrie (K1 i k) a
KTrie Trie k b
t) of
Just (KTrie t') -> Trie k c
t'
Nothing -> Trie k c
forall k a. TrieKey k => Trie k a
trieEmpty
{-# INLINE gtrieLookup #-}
{-# INLINE gtrieInsert #-}
{-# INLINE gtrieSingleton #-}
{-# INLINE gtrieDelete #-}
{-# INLINE gtrieMap #-}
{-# INLINE gtrieTraverse #-}
{-# INLINE gfoldWithKey #-}
{-# INLINE gtraverseWithKey #-}
{-# INLINE gmergeWithKey #-}
{-# INLINE gmapMaybeWithKey #-}
instance TrieKey k => GTrieKeyShow (K1 i k) where
gtrieShowsPrec :: Int -> GTrie (K1 i k) a -> ShowS
gtrieShowsPrec p :: Int
p (KTrie x) = Int -> Trie k a -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
p Trie k a
x
instance (GTrieKey f, GTrieKey g) => GTrieKey (f :*: g) where
gtrieLookup :: (:*:) f g p -> GTrie (f :*: g) a -> Maybe a
gtrieLookup (i :: f p
i :*: j :: g p
j) (PTrie x) = g p -> GTrie g a -> Maybe a
forall (f :: * -> *) p a. GTrieKey f => f p -> GTrie f a -> Maybe a
gtrieLookup g p
j (GTrie g a -> Maybe a) -> Maybe (GTrie g a) -> Maybe a
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< f p -> GTrie f (GTrie g a) -> Maybe (GTrie g a)
forall (f :: * -> *) p a. GTrieKey f => f p -> GTrie f a -> Maybe a
gtrieLookup f p
i GTrie f (GTrie g a)
x
gtrieInsert :: (:*:) f g p -> a -> GTrie (f :*: g) a -> GTrie (f :*: g) a
gtrieInsert (i :: f p
i :*: j :: g p
j) v :: a
v (PTrie t) = case f p -> GTrie f (GTrie g a) -> Maybe (GTrie g a)
forall (f :: * -> *) p a. GTrieKey f => f p -> GTrie f a -> Maybe a
gtrieLookup f p
i GTrie f (GTrie g a)
t of
Nothing -> GTrie f (GTrie g a) -> GTrie (f :*: g) a
forall (f :: * -> *) (g :: * -> *) a.
GTrie f (GTrie g a) -> GTrie (f :*: g) a
PTrie (f p -> GTrie g a -> GTrie f (GTrie g a) -> GTrie f (GTrie g a)
forall (f :: * -> *) p a.
GTrieKey f =>
f p -> a -> GTrie f a -> GTrie f a
gtrieInsert f p
i (g p -> a -> GTrie g a
forall (f :: * -> *) p a. GTrieKey f => f p -> a -> GTrie f a
gtrieSingleton g p
j a
v) GTrie f (GTrie g a)
t)
Just ti :: GTrie g a
ti -> GTrie f (GTrie g a) -> GTrie (f :*: g) a
forall (f :: * -> *) (g :: * -> *) a.
GTrie f (GTrie g a) -> GTrie (f :*: g) a
PTrie (f p -> GTrie g a -> GTrie f (GTrie g a) -> GTrie f (GTrie g a)
forall (f :: * -> *) p a.
GTrieKey f =>
f p -> a -> GTrie f a -> GTrie f a
gtrieInsert f p
i (g p -> a -> GTrie g a -> GTrie g a
forall (f :: * -> *) p a.
GTrieKey f =>
f p -> a -> GTrie f a -> GTrie f a
gtrieInsert g p
j a
v GTrie g a
ti) GTrie f (GTrie g a)
t)
gtrieDelete :: (:*:) f g p -> GTrie (f :*: g) a -> Maybe (GTrie (f :*: g) a)
gtrieDelete (i :: f p
i :*: j :: g p
j) (PTrie t) = case f p -> GTrie f (GTrie g a) -> Maybe (GTrie g a)
forall (f :: * -> *) p a. GTrieKey f => f p -> GTrie f a -> Maybe a
gtrieLookup f p
i GTrie f (GTrie g a)
t of
Nothing -> GTrie (f :*: g) a -> Maybe (GTrie (f :*: g) a)
forall a. a -> Maybe a
Just (GTrie f (GTrie g a) -> GTrie (f :*: g) a
forall (f :: * -> *) (g :: * -> *) a.
GTrie f (GTrie g a) -> GTrie (f :*: g) a
PTrie GTrie f (GTrie g a)
t)
Just ti :: GTrie g a
ti -> case g p -> GTrie g a -> Maybe (GTrie g a)
forall (f :: * -> *) p a.
GTrieKey f =>
f p -> GTrie f a -> Maybe (GTrie f a)
gtrieDelete g p
j GTrie g a
ti of
Nothing -> (GTrie f (GTrie g a) -> GTrie (f :*: g) a)
-> Maybe (GTrie f (GTrie g a)) -> Maybe (GTrie (f :*: g) a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap GTrie f (GTrie g a) -> GTrie (f :*: g) a
forall (f :: * -> *) (g :: * -> *) a.
GTrie f (GTrie g a) -> GTrie (f :*: g) a
PTrie (Maybe (GTrie f (GTrie g a)) -> Maybe (GTrie (f :*: g) a))
-> Maybe (GTrie f (GTrie g a)) -> Maybe (GTrie (f :*: g) a)
forall a b. (a -> b) -> a -> b
$! f p -> GTrie f (GTrie g a) -> Maybe (GTrie f (GTrie g a))
forall (f :: * -> *) p a.
GTrieKey f =>
f p -> GTrie f a -> Maybe (GTrie f a)
gtrieDelete f p
i GTrie f (GTrie g a)
t
Just tj :: GTrie g a
tj -> GTrie (f :*: g) a -> Maybe (GTrie (f :*: g) a)
forall a. a -> Maybe a
Just (GTrie (f :*: g) a -> Maybe (GTrie (f :*: g) a))
-> GTrie (f :*: g) a -> Maybe (GTrie (f :*: g) a)
forall a b. (a -> b) -> a -> b
$! GTrie f (GTrie g a) -> GTrie (f :*: g) a
forall (f :: * -> *) (g :: * -> *) a.
GTrie f (GTrie g a) -> GTrie (f :*: g) a
PTrie (f p -> GTrie g a -> GTrie f (GTrie g a) -> GTrie f (GTrie g a)
forall (f :: * -> *) p a.
GTrieKey f =>
f p -> a -> GTrie f a -> GTrie f a
gtrieInsert f p
i GTrie g a
tj GTrie f (GTrie g a)
t)
gtrieSingleton :: (:*:) f g p -> a -> GTrie (f :*: g) a
gtrieSingleton (i :: f p
i :*: j :: g p
j) v :: a
v = GTrie f (GTrie g a) -> GTrie (f :*: g) a
forall (f :: * -> *) (g :: * -> *) a.
GTrie f (GTrie g a) -> GTrie (f :*: g) a
PTrie (f p -> GTrie g a -> GTrie f (GTrie g a)
forall (f :: * -> *) p a. GTrieKey f => f p -> a -> GTrie f a
gtrieSingleton f p
i (g p -> a -> GTrie g a
forall (f :: * -> *) p a. GTrieKey f => f p -> a -> GTrie f a
gtrieSingleton g p
j a
v))
gtrieMap :: (a -> b) -> GTrie (f :*: g) a -> GTrie (f :*: g) b
gtrieMap f :: a -> b
f (PTrie x) = GTrie f (GTrie g b) -> GTrie (f :*: g) b
forall (f :: * -> *) (g :: * -> *) a.
GTrie f (GTrie g a) -> GTrie (f :*: g) a
PTrie ((GTrie g a -> GTrie g b)
-> GTrie f (GTrie g a) -> GTrie f (GTrie g b)
forall (f :: * -> *) a b.
GTrieKey f =>
(a -> b) -> GTrie f a -> GTrie f b
gtrieMap ((a -> b) -> GTrie g a -> GTrie g b
forall (f :: * -> *) a b.
GTrieKey f =>
(a -> b) -> GTrie f a -> GTrie f b
gtrieMap a -> b
f) GTrie f (GTrie g a)
x)
gtrieTraverse :: (a -> m b) -> GTrie (f :*: g) a -> m (GTrie (f :*: g) b)
gtrieTraverse f :: a -> m b
f (PTrie x) = (GTrie f (GTrie g b) -> GTrie (f :*: g) b)
-> m (GTrie f (GTrie g b)) -> m (GTrie (f :*: g) b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap GTrie f (GTrie g b) -> GTrie (f :*: g) b
forall (f :: * -> *) (g :: * -> *) a.
GTrie f (GTrie g a) -> GTrie (f :*: g) a
PTrie ((GTrie g a -> m (GTrie g b))
-> GTrie f (GTrie g a) -> m (GTrie f (GTrie g b))
forall (f :: * -> *) (m :: * -> *) a b.
(GTrieKey f, Applicative m) =>
(a -> m b) -> GTrie f a -> m (GTrie f b)
gtrieTraverse ((a -> m b) -> GTrie g a -> m (GTrie g b)
forall (f :: * -> *) (m :: * -> *) a b.
(GTrieKey f, Applicative m) =>
(a -> m b) -> GTrie f a -> m (GTrie f b)
gtrieTraverse a -> m b
f) GTrie f (GTrie g a)
x)
gmapMaybeWithKey :: ((:*:) f g p -> a -> Maybe b)
-> GTrie (f :*: g) a -> Maybe (GTrie (f :*: g) b)
gmapMaybeWithKey f :: (:*:) f g p -> a -> Maybe b
f (PTrie x) = (GTrie f (GTrie g b) -> GTrie (f :*: g) b)
-> Maybe (GTrie f (GTrie g b)) -> Maybe (GTrie (f :*: g) b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap GTrie f (GTrie g b) -> GTrie (f :*: g) b
forall (f :: * -> *) (g :: * -> *) a.
GTrie f (GTrie g a) -> GTrie (f :*: g) a
PTrie ((f p -> GTrie g a -> Maybe (GTrie g b))
-> GTrie f (GTrie g a) -> Maybe (GTrie f (GTrie g b))
forall (f :: * -> *) p a b.
GTrieKey f =>
(f p -> a -> Maybe b) -> GTrie f a -> Maybe (GTrie f b)
gmapMaybeWithKey (\i :: f p
i -> (g p -> a -> Maybe b) -> GTrie g a -> Maybe (GTrie g b)
forall (f :: * -> *) p a b.
GTrieKey f =>
(f p -> a -> Maybe b) -> GTrie f a -> Maybe (GTrie f b)
gmapMaybeWithKey (\j :: g p
j -> (:*:) f g p -> a -> Maybe b
f (f p
if p -> g p -> (:*:) f g p
forall k (f :: k -> *) (g :: k -> *) (p :: k).
f p -> g p -> (:*:) f g p
:*:g p
j))) GTrie f (GTrie g a)
x)
gfoldWithKey :: ((:*:) f g p -> a -> r -> r) -> r -> GTrie (f :*: g) a -> r
gfoldWithKey f :: (:*:) f g p -> a -> r -> r
f z :: r
z (PTrie x) = (f p -> GTrie g a -> r -> r) -> r -> GTrie f (GTrie g a) -> r
forall (f :: * -> *) p a r.
GTrieKey f =>
(f p -> a -> r -> r) -> r -> GTrie f a -> r
gfoldWithKey (\i :: f p
i m :: GTrie g a
m r :: r
r -> (g p -> a -> r -> r) -> r -> GTrie g a -> r
forall (f :: * -> *) p a r.
GTrieKey f =>
(f p -> a -> r -> r) -> r -> GTrie f a -> r
gfoldWithKey (\j :: g p
j -> (:*:) f g p -> a -> r -> r
f (f p
if p -> g p -> (:*:) f g p
forall k (f :: k -> *) (g :: k -> *) (p :: k).
f p -> g p -> (:*:) f g p
:*:g p
j)) r
r GTrie g a
m) r
z GTrie f (GTrie g a)
x
gtraverseWithKey :: ((:*:) f g p -> a -> m b)
-> GTrie (f :*: g) a -> m (GTrie (f :*: g) b)
gtraverseWithKey f :: (:*:) f g p -> a -> m b
f (PTrie x) = (GTrie f (GTrie g b) -> GTrie (f :*: g) b)
-> m (GTrie f (GTrie g b)) -> m (GTrie (f :*: g) b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap GTrie f (GTrie g b) -> GTrie (f :*: g) b
forall (f :: * -> *) (g :: * -> *) a.
GTrie f (GTrie g a) -> GTrie (f :*: g) a
PTrie ((f p -> GTrie g a -> m (GTrie g b))
-> GTrie f (GTrie g a) -> m (GTrie f (GTrie g b))
forall (f :: * -> *) (m :: * -> *) p a b.
(GTrieKey f, Applicative m) =>
(f p -> a -> m b) -> GTrie f a -> m (GTrie f b)
gtraverseWithKey (\i :: f p
i ->
(g p -> a -> m b) -> GTrie g a -> m (GTrie g b)
forall (f :: * -> *) (m :: * -> *) p a b.
(GTrieKey f, Applicative m) =>
(f p -> a -> m b) -> GTrie f a -> m (GTrie f b)
gtraverseWithKey (\j :: g p
j -> (:*:) f g p -> a -> m b
f (f p
i f p -> g p -> (:*:) f g p
forall k (f :: k -> *) (g :: k -> *) (p :: k).
f p -> g p -> (:*:) f g p
:*: g p
j))) GTrie f (GTrie g a)
x)
gmergeWithKey :: ((:*:) f g p -> a -> b -> Maybe c)
-> (GTrie (f :*: g) a -> Maybe (GTrie (f :*: g) c))
-> (GTrie (f :*: g) b -> Maybe (GTrie (f :*: g) c))
-> GTrie (f :*: g) a
-> GTrie (f :*: g) b
-> Maybe (GTrie (f :*: g) c)
gmergeWithKey f :: (:*:) f g p -> a -> b -> Maybe c
f g :: GTrie (f :*: g) a -> Maybe (GTrie (f :*: g) c)
g h :: GTrie (f :*: g) b -> Maybe (GTrie (f :*: g) c)
h (PTrie x) (PTrie y) =
(GTrie f (GTrie g c) -> GTrie (f :*: g) c)
-> Maybe (GTrie f (GTrie g c)) -> Maybe (GTrie (f :*: g) c)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap GTrie f (GTrie g c) -> GTrie (f :*: g) c
forall (f :: * -> *) (g :: * -> *) a.
GTrie f (GTrie g a) -> GTrie (f :*: g) a
PTrie (Maybe (GTrie f (GTrie g c)) -> Maybe (GTrie (f :*: g) c))
-> Maybe (GTrie f (GTrie g c)) -> Maybe (GTrie (f :*: g) c)
forall a b. (a -> b) -> a -> b
$!
(f p -> GTrie g a -> GTrie g b -> Maybe (GTrie g c))
-> (GTrie f (GTrie g a) -> Maybe (GTrie f (GTrie g c)))
-> (GTrie f (GTrie g b) -> Maybe (GTrie f (GTrie g c)))
-> GTrie f (GTrie g a)
-> GTrie f (GTrie g b)
-> Maybe (GTrie f (GTrie g c))
forall (f :: * -> *) p a b c.
GTrieKey f =>
(f p -> a -> b -> Maybe c)
-> (GTrie f a -> Maybe (GTrie f c))
-> (GTrie f b -> Maybe (GTrie f c))
-> GTrie f a
-> GTrie f b
-> Maybe (GTrie f c)
gmergeWithKey
(\i :: f p
i ->
(g p -> a -> b -> Maybe c)
-> (GTrie g a -> Maybe (GTrie g c))
-> (GTrie g b -> Maybe (GTrie g c))
-> GTrie g a
-> GTrie g b
-> Maybe (GTrie g c)
forall (f :: * -> *) p a b c.
GTrieKey f =>
(f p -> a -> b -> Maybe c)
-> (GTrie f a -> Maybe (GTrie f c))
-> (GTrie f b -> Maybe (GTrie f c))
-> GTrie f a
-> GTrie f b
-> Maybe (GTrie f c)
gmergeWithKey
(\j :: g p
j -> (:*:) f g p -> a -> b -> Maybe c
f (f p
if p -> g p -> (:*:) f g p
forall k (f :: k -> *) (g :: k -> *) (p :: k).
f p -> g p -> (:*:) f g p
:*:g p
j))
(f p -> GTrie g a -> Maybe (GTrie g c)
g' f p
i)
(f p -> GTrie g b -> Maybe (GTrie g c)
h' f p
i))
((GTrie (f :*: g) a -> Maybe (GTrie (f :*: g) c))
-> GTrie f (GTrie g a) -> Maybe (GTrie f (GTrie g c))
forall a b. Coercible a b => a -> b
coerce GTrie (f :*: g) a -> Maybe (GTrie (f :*: g) c)
g)
((GTrie (f :*: g) b -> Maybe (GTrie (f :*: g) c))
-> GTrie f (GTrie g b) -> Maybe (GTrie f (GTrie g c))
forall a b. Coercible a b => a -> b
coerce GTrie (f :*: g) b -> Maybe (GTrie (f :*: g) c)
h)
GTrie f (GTrie g a)
x
GTrie f (GTrie g b)
y
where
g' :: f p -> GTrie g a -> Maybe (GTrie g c)
g' i :: f p
i t :: GTrie g a
t = do PTrie t' <- GTrie (f :*: g) a -> Maybe (GTrie (f :*: g) c)
g (GTrie f (GTrie g a) -> GTrie (f :*: g) a
forall (f :: * -> *) (g :: * -> *) a.
GTrie f (GTrie g a) -> GTrie (f :*: g) a
PTrie (f p -> GTrie g a -> GTrie f (GTrie g a)
forall (f :: * -> *) p a. GTrieKey f => f p -> a -> GTrie f a
gtrieSingleton f p
i GTrie g a
t))
f p -> GTrie f (GTrie g c) -> Maybe (GTrie g c)
forall (f :: * -> *) p a. GTrieKey f => f p -> GTrie f a -> Maybe a
gtrieLookup f p
i GTrie f (GTrie g c)
t'
h' :: f p -> GTrie g b -> Maybe (GTrie g c)
h' i :: f p
i t :: GTrie g b
t = do PTrie t' <- GTrie (f :*: g) b -> Maybe (GTrie (f :*: g) c)
h (GTrie f (GTrie g b) -> GTrie (f :*: g) b
forall (f :: * -> *) (g :: * -> *) a.
GTrie f (GTrie g a) -> GTrie (f :*: g) a
PTrie (f p -> GTrie g b -> GTrie f (GTrie g b)
forall (f :: * -> *) p a. GTrieKey f => f p -> a -> GTrie f a
gtrieSingleton f p
i GTrie g b
t))
f p -> GTrie f (GTrie g c) -> Maybe (GTrie g c)
forall (f :: * -> *) p a. GTrieKey f => f p -> GTrie f a -> Maybe a
gtrieLookup f p
i GTrie f (GTrie g c)
t'
{-# INLINE gtrieLookup #-}
{-# INLINE gtrieInsert #-}
{-# INLINE gtrieDelete #-}
{-# INLINE gtrieSingleton #-}
{-# INLINE gtrieMap #-}
{-# INLINE gtrieTraverse #-}
{-# INLINE gfoldWithKey #-}
{-# INLINE gtraverseWithKey #-}
{-# INLINE gmergeWithKey #-}
{-# INLINE gmapMaybeWithKey #-}
instance (GTrieKeyShow f, GTrieKeyShow g) => GTrieKeyShow (f :*: g) where
gtrieShowsPrec :: Int -> GTrie (f :*: g) a -> ShowS
gtrieShowsPrec p :: Int
p (PTrie x) = Int -> GTrie f (GTrie g a) -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
p GTrie f (GTrie g a)
x
instance (GTrieKey f, GTrieKey g) => GTrieKey (f :+: g) where
gtrieLookup :: (:+:) f g p -> GTrie (f :+: g) a -> Maybe a
gtrieLookup (L1 k :: f p
k) (STrieL x) = f p -> GTrie f a -> Maybe a
forall (f :: * -> *) p a. GTrieKey f => f p -> GTrie f a -> Maybe a
gtrieLookup f p
k GTrie f a
x
gtrieLookup (L1 k :: f p
k) (STrieB x _) = f p -> GTrie f a -> Maybe a
forall (f :: * -> *) p a. GTrieKey f => f p -> GTrie f a -> Maybe a
gtrieLookup f p
k GTrie f a
x
gtrieLookup (R1 k :: g p
k) (STrieR y) = g p -> GTrie g a -> Maybe a
forall (f :: * -> *) p a. GTrieKey f => f p -> GTrie f a -> Maybe a
gtrieLookup g p
k GTrie g a
y
gtrieLookup (R1 k :: g p
k) (STrieB _ y) = g p -> GTrie g a -> Maybe a
forall (f :: * -> *) p a. GTrieKey f => f p -> GTrie f a -> Maybe a
gtrieLookup g p
k GTrie g a
y
gtrieLookup _ _ = Maybe a
forall a. Maybe a
Nothing
gtrieInsert :: (:+:) f g p -> a -> GTrie (f :+: g) a -> GTrie (f :+: g) a
gtrieInsert (L1 k :: f p
k) v :: a
v (STrieL x) = GTrie f a -> GTrie (f :+: g) a
forall (f :: * -> *) (g :: * -> *) a.
GTrie f a -> GTrie (f :+: g) a
STrieL (f p -> a -> GTrie f a -> GTrie f a
forall (f :: * -> *) p a.
GTrieKey f =>
f p -> a -> GTrie f a -> GTrie f a
gtrieInsert f p
k a
v GTrie f a
x)
gtrieInsert (L1 k :: f p
k) v :: a
v (STrieR y) = GTrie f a -> GTrie g a -> GTrie (f :+: g) a
forall (f :: * -> *) (g :: * -> *) a.
GTrie f a -> GTrie g a -> GTrie (f :+: g) a
STrieB (f p -> a -> GTrie f a
forall (f :: * -> *) p a. GTrieKey f => f p -> a -> GTrie f a
gtrieSingleton f p
k a
v) GTrie g a
y
gtrieInsert (L1 k :: f p
k) v :: a
v (STrieB x y) = GTrie f a -> GTrie g a -> GTrie (f :+: g) a
forall (f :: * -> *) (g :: * -> *) a.
GTrie f a -> GTrie g a -> GTrie (f :+: g) a
STrieB (f p -> a -> GTrie f a -> GTrie f a
forall (f :: * -> *) p a.
GTrieKey f =>
f p -> a -> GTrie f a -> GTrie f a
gtrieInsert f p
k a
v GTrie f a
x) GTrie g a
y
gtrieInsert (R1 k :: g p
k) v :: a
v (STrieL x) = GTrie f a -> GTrie g a -> GTrie (f :+: g) a
forall (f :: * -> *) (g :: * -> *) a.
GTrie f a -> GTrie g a -> GTrie (f :+: g) a
STrieB GTrie f a
x (g p -> a -> GTrie g a
forall (f :: * -> *) p a. GTrieKey f => f p -> a -> GTrie f a
gtrieSingleton g p
k a
v)
gtrieInsert (R1 k :: g p
k) v :: a
v (STrieR y) = GTrie g a -> GTrie (f :+: g) a
forall (f :: * -> *) (g :: * -> *) a.
GTrie g a -> GTrie (f :+: g) a
STrieR (g p -> a -> GTrie g a -> GTrie g a
forall (f :: * -> *) p a.
GTrieKey f =>
f p -> a -> GTrie f a -> GTrie f a
gtrieInsert g p
k a
v GTrie g a
y)
gtrieInsert (R1 k :: g p
k) v :: a
v (STrieB x y) = GTrie f a -> GTrie g a -> GTrie (f :+: g) a
forall (f :: * -> *) (g :: * -> *) a.
GTrie f a -> GTrie g a -> GTrie (f :+: g) a
STrieB GTrie f a
x (g p -> a -> GTrie g a -> GTrie g a
forall (f :: * -> *) p a.
GTrieKey f =>
f p -> a -> GTrie f a -> GTrie f a
gtrieInsert g p
k a
v GTrie g a
y)
gtrieSingleton :: (:+:) f g p -> a -> GTrie (f :+: g) a
gtrieSingleton (L1 k :: f p
k) v :: a
v = GTrie f a -> GTrie (f :+: g) a
forall (f :: * -> *) (g :: * -> *) a.
GTrie f a -> GTrie (f :+: g) a
STrieL (f p -> a -> GTrie f a
forall (f :: * -> *) p a. GTrieKey f => f p -> a -> GTrie f a
gtrieSingleton f p
k a
v)
gtrieSingleton (R1 k :: g p
k) v :: a
v = GTrie g a -> GTrie (f :+: g) a
forall (f :: * -> *) (g :: * -> *) a.
GTrie g a -> GTrie (f :+: g) a
STrieR (g p -> a -> GTrie g a
forall (f :: * -> *) p a. GTrieKey f => f p -> a -> GTrie f a
gtrieSingleton g p
k a
v)
gtrieDelete :: (:+:) f g p -> GTrie (f :+: g) a -> Maybe (GTrie (f :+: g) a)
gtrieDelete (L1 k :: f p
k) (STrieL x) = (GTrie f a -> GTrie (f :+: g) a)
-> Maybe (GTrie f a) -> Maybe (GTrie (f :+: g) a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap GTrie f a -> GTrie (f :+: g) a
forall (f :: * -> *) (g :: * -> *) a.
GTrie f a -> GTrie (f :+: g) a
STrieL (Maybe (GTrie f a) -> Maybe (GTrie (f :+: g) a))
-> Maybe (GTrie f a) -> Maybe (GTrie (f :+: g) a)
forall a b. (a -> b) -> a -> b
$! f p -> GTrie f a -> Maybe (GTrie f a)
forall (f :: * -> *) p a.
GTrieKey f =>
f p -> GTrie f a -> Maybe (GTrie f a)
gtrieDelete f p
k GTrie f a
x
gtrieDelete (L1 _) (STrieR y) = GTrie (f :+: g) a -> Maybe (GTrie (f :+: g) a)
forall a. a -> Maybe a
Just (GTrie (f :+: g) a -> Maybe (GTrie (f :+: g) a))
-> GTrie (f :+: g) a -> Maybe (GTrie (f :+: g) a)
forall a b. (a -> b) -> a -> b
$! GTrie g a -> GTrie (f :+: g) a
forall (f :: * -> *) (g :: * -> *) a.
GTrie g a -> GTrie (f :+: g) a
STrieR GTrie g a
y
gtrieDelete (L1 k :: f p
k) (STrieB x y) = case f p -> GTrie f a -> Maybe (GTrie f a)
forall (f :: * -> *) p a.
GTrieKey f =>
f p -> GTrie f a -> Maybe (GTrie f a)
gtrieDelete f p
k GTrie f a
x of
Nothing -> GTrie (f :+: g) a -> Maybe (GTrie (f :+: g) a)
forall a. a -> Maybe a
Just (GTrie (f :+: g) a -> Maybe (GTrie (f :+: g) a))
-> GTrie (f :+: g) a -> Maybe (GTrie (f :+: g) a)
forall a b. (a -> b) -> a -> b
$! GTrie g a -> GTrie (f :+: g) a
forall (f :: * -> *) (g :: * -> *) a.
GTrie g a -> GTrie (f :+: g) a
STrieR GTrie g a
y
Just x' :: GTrie f a
x' -> GTrie (f :+: g) a -> Maybe (GTrie (f :+: g) a)
forall a. a -> Maybe a
Just (GTrie (f :+: g) a -> Maybe (GTrie (f :+: g) a))
-> GTrie (f :+: g) a -> Maybe (GTrie (f :+: g) a)
forall a b. (a -> b) -> a -> b
$! GTrie f a -> GTrie g a -> GTrie (f :+: g) a
forall (f :: * -> *) (g :: * -> *) a.
GTrie f a -> GTrie g a -> GTrie (f :+: g) a
STrieB GTrie f a
x' GTrie g a
y
gtrieDelete (R1 _) (STrieL x) = GTrie (f :+: g) a -> Maybe (GTrie (f :+: g) a)
forall a. a -> Maybe a
Just (GTrie (f :+: g) a -> Maybe (GTrie (f :+: g) a))
-> GTrie (f :+: g) a -> Maybe (GTrie (f :+: g) a)
forall a b. (a -> b) -> a -> b
$! GTrie f a -> GTrie (f :+: g) a
forall (f :: * -> *) (g :: * -> *) a.
GTrie f a -> GTrie (f :+: g) a
STrieL GTrie f a
x
gtrieDelete (R1 k :: g p
k) (STrieR y) = (GTrie g a -> GTrie (f :+: g) a)
-> Maybe (GTrie g a) -> Maybe (GTrie (f :+: g) a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap GTrie g a -> GTrie (f :+: g) a
forall (f :: * -> *) (g :: * -> *) a.
GTrie g a -> GTrie (f :+: g) a
STrieR (Maybe (GTrie g a) -> Maybe (GTrie (f :+: g) a))
-> Maybe (GTrie g a) -> Maybe (GTrie (f :+: g) a)
forall a b. (a -> b) -> a -> b
$! g p -> GTrie g a -> Maybe (GTrie g a)
forall (f :: * -> *) p a.
GTrieKey f =>
f p -> GTrie f a -> Maybe (GTrie f a)
gtrieDelete g p
k GTrie g a
y
gtrieDelete (R1 k :: g p
k) (STrieB x y) = case g p -> GTrie g a -> Maybe (GTrie g a)
forall (f :: * -> *) p a.
GTrieKey f =>
f p -> GTrie f a -> Maybe (GTrie f a)
gtrieDelete g p
k GTrie g a
y of
Nothing -> GTrie (f :+: g) a -> Maybe (GTrie (f :+: g) a)
forall a. a -> Maybe a
Just (GTrie (f :+: g) a -> Maybe (GTrie (f :+: g) a))
-> GTrie (f :+: g) a -> Maybe (GTrie (f :+: g) a)
forall a b. (a -> b) -> a -> b
$! GTrie f a -> GTrie (f :+: g) a
forall (f :: * -> *) (g :: * -> *) a.
GTrie f a -> GTrie (f :+: g) a
STrieL GTrie f a
x
Just y' :: GTrie g a
y' -> GTrie (f :+: g) a -> Maybe (GTrie (f :+: g) a)
forall a. a -> Maybe a
Just (GTrie (f :+: g) a -> Maybe (GTrie (f :+: g) a))
-> GTrie (f :+: g) a -> Maybe (GTrie (f :+: g) a)
forall a b. (a -> b) -> a -> b
$! GTrie f a -> GTrie g a -> GTrie (f :+: g) a
forall (f :: * -> *) (g :: * -> *) a.
GTrie f a -> GTrie g a -> GTrie (f :+: g) a
STrieB GTrie f a
x GTrie g a
y'
gtrieMap :: (a -> b) -> GTrie (f :+: g) a -> GTrie (f :+: g) b
gtrieMap f :: a -> b
f (STrieB x y) = GTrie f b -> GTrie g b -> GTrie (f :+: g) b
forall (f :: * -> *) (g :: * -> *) a.
GTrie f a -> GTrie g a -> GTrie (f :+: g) a
STrieB ((a -> b) -> GTrie f a -> GTrie f b
forall (f :: * -> *) a b.
GTrieKey f =>
(a -> b) -> GTrie f a -> GTrie f b
gtrieMap a -> b
f GTrie f a
x) ((a -> b) -> GTrie g a -> GTrie g b
forall (f :: * -> *) a b.
GTrieKey f =>
(a -> b) -> GTrie f a -> GTrie f b
gtrieMap a -> b
f GTrie g a
y)
gtrieMap f :: a -> b
f (STrieL x) = GTrie f b -> GTrie (f :+: g) b
forall (f :: * -> *) (g :: * -> *) a.
GTrie f a -> GTrie (f :+: g) a
STrieL ((a -> b) -> GTrie f a -> GTrie f b
forall (f :: * -> *) a b.
GTrieKey f =>
(a -> b) -> GTrie f a -> GTrie f b
gtrieMap a -> b
f GTrie f a
x)
gtrieMap f :: a -> b
f (STrieR y) = GTrie g b -> GTrie (f :+: g) b
forall (f :: * -> *) (g :: * -> *) a.
GTrie g a -> GTrie (f :+: g) a
STrieR ((a -> b) -> GTrie g a -> GTrie g b
forall (f :: * -> *) a b.
GTrieKey f =>
(a -> b) -> GTrie f a -> GTrie f b
gtrieMap a -> b
f GTrie g a
y)
gtrieTraverse :: (a -> m b) -> GTrie (f :+: g) a -> m (GTrie (f :+: g) b)
gtrieTraverse f :: a -> m b
f (STrieB x y) = (GTrie f b -> GTrie g b -> GTrie (f :+: g) b)
-> m (GTrie f b) -> m (GTrie g b) -> m (GTrie (f :+: g) b)
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 GTrie f b -> GTrie g b -> GTrie (f :+: g) b
forall (f :: * -> *) (g :: * -> *) a.
GTrie f a -> GTrie g a -> GTrie (f :+: g) a
STrieB ((a -> m b) -> GTrie f a -> m (GTrie f b)
forall (f :: * -> *) (m :: * -> *) a b.
(GTrieKey f, Applicative m) =>
(a -> m b) -> GTrie f a -> m (GTrie f b)
gtrieTraverse a -> m b
f GTrie f a
x) ((a -> m b) -> GTrie g a -> m (GTrie g b)
forall (f :: * -> *) (m :: * -> *) a b.
(GTrieKey f, Applicative m) =>
(a -> m b) -> GTrie f a -> m (GTrie f b)
gtrieTraverse a -> m b
f GTrie g a
y)
gtrieTraverse f :: a -> m b
f (STrieL x) = (GTrie f b -> GTrie (f :+: g) b)
-> m (GTrie f b) -> m (GTrie (f :+: g) b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap GTrie f b -> GTrie (f :+: g) b
forall (f :: * -> *) (g :: * -> *) a.
GTrie f a -> GTrie (f :+: g) a
STrieL ((a -> m b) -> GTrie f a -> m (GTrie f b)
forall (f :: * -> *) (m :: * -> *) a b.
(GTrieKey f, Applicative m) =>
(a -> m b) -> GTrie f a -> m (GTrie f b)
gtrieTraverse a -> m b
f GTrie f a
x)
gtrieTraverse f :: a -> m b
f (STrieR y) = (GTrie g b -> GTrie (f :+: g) b)
-> m (GTrie g b) -> m (GTrie (f :+: g) b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap GTrie g b -> GTrie (f :+: g) b
forall (f :: * -> *) (g :: * -> *) a.
GTrie g a -> GTrie (f :+: g) a
STrieR ((a -> m b) -> GTrie g a -> m (GTrie g b)
forall (f :: * -> *) (m :: * -> *) a b.
(GTrieKey f, Applicative m) =>
(a -> m b) -> GTrie f a -> m (GTrie f b)
gtrieTraverse a -> m b
f GTrie g a
y)
gmapMaybeWithKey :: ((:+:) f g p -> a -> Maybe b)
-> GTrie (f :+: g) a -> Maybe (GTrie (f :+: g) b)
gmapMaybeWithKey f :: (:+:) f g p -> a -> Maybe b
f (STrieL x) = (GTrie f b -> GTrie (f :+: g) b)
-> Maybe (GTrie f b) -> Maybe (GTrie (f :+: g) b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap GTrie f b -> GTrie (f :+: g) b
forall (f :: * -> *) (g :: * -> *) a.
GTrie f a -> GTrie (f :+: g) a
STrieL (Maybe (GTrie f b) -> Maybe (GTrie (f :+: g) b))
-> Maybe (GTrie f b) -> Maybe (GTrie (f :+: g) b)
forall a b. (a -> b) -> a -> b
$! (f p -> a -> Maybe b) -> GTrie f a -> Maybe (GTrie f b)
forall (f :: * -> *) p a b.
GTrieKey f =>
(f p -> a -> Maybe b) -> GTrie f a -> Maybe (GTrie f b)
gmapMaybeWithKey ((:+:) f g p -> a -> Maybe b
f ((:+:) f g p -> a -> Maybe b)
-> (f p -> (:+:) f g p) -> f p -> a -> Maybe b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. f p -> (:+:) f g p
forall k (f :: k -> *) (g :: k -> *) (p :: k). f p -> (:+:) f g p
L1) GTrie f a
x
gmapMaybeWithKey f :: (:+:) f g p -> a -> Maybe b
f (STrieR y) = (GTrie g b -> GTrie (f :+: g) b)
-> Maybe (GTrie g b) -> Maybe (GTrie (f :+: g) b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap GTrie g b -> GTrie (f :+: g) b
forall (f :: * -> *) (g :: * -> *) a.
GTrie g a -> GTrie (f :+: g) a
STrieR (Maybe (GTrie g b) -> Maybe (GTrie (f :+: g) b))
-> Maybe (GTrie g b) -> Maybe (GTrie (f :+: g) b)
forall a b. (a -> b) -> a -> b
$! (g p -> a -> Maybe b) -> GTrie g a -> Maybe (GTrie g b)
forall (f :: * -> *) p a b.
GTrieKey f =>
(f p -> a -> Maybe b) -> GTrie f a -> Maybe (GTrie f b)
gmapMaybeWithKey ((:+:) f g p -> a -> Maybe b
f ((:+:) f g p -> a -> Maybe b)
-> (g p -> (:+:) f g p) -> g p -> a -> Maybe b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. g p -> (:+:) f g p
forall k (f :: k -> *) (g :: k -> *) (p :: k). g p -> (:+:) f g p
R1) GTrie g a
y
gmapMaybeWithKey f :: (:+:) f g p -> a -> Maybe b
f (STrieB x y) = case ((f p -> a -> Maybe b) -> GTrie f a -> Maybe (GTrie f b)
forall (f :: * -> *) p a b.
GTrieKey f =>
(f p -> a -> Maybe b) -> GTrie f a -> Maybe (GTrie f b)
gmapMaybeWithKey ((:+:) f g p -> a -> Maybe b
f ((:+:) f g p -> a -> Maybe b)
-> (f p -> (:+:) f g p) -> f p -> a -> Maybe b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. f p -> (:+:) f g p
forall k (f :: k -> *) (g :: k -> *) (p :: k). f p -> (:+:) f g p
L1) GTrie f a
x, (g p -> a -> Maybe b) -> GTrie g a -> Maybe (GTrie g b)
forall (f :: * -> *) p a b.
GTrieKey f =>
(f p -> a -> Maybe b) -> GTrie f a -> Maybe (GTrie f b)
gmapMaybeWithKey ((:+:) f g p -> a -> Maybe b
f ((:+:) f g p -> a -> Maybe b)
-> (g p -> (:+:) f g p) -> g p -> a -> Maybe b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. g p -> (:+:) f g p
forall k (f :: k -> *) (g :: k -> *) (p :: k). g p -> (:+:) f g p
R1) GTrie g a
y) of
(Nothing, Nothing) -> Maybe (GTrie (f :+: g) b)
forall a. Maybe a
Nothing
(Just x' :: GTrie f b
x', Nothing) -> GTrie (f :+: g) b -> Maybe (GTrie (f :+: g) b)
forall a. a -> Maybe a
Just (GTrie (f :+: g) b -> Maybe (GTrie (f :+: g) b))
-> GTrie (f :+: g) b -> Maybe (GTrie (f :+: g) b)
forall a b. (a -> b) -> a -> b
$! GTrie f b -> GTrie (f :+: g) b
forall (f :: * -> *) (g :: * -> *) a.
GTrie f a -> GTrie (f :+: g) a
STrieL GTrie f b
x'
(Nothing, Just y' :: GTrie g b
y') -> GTrie (f :+: g) b -> Maybe (GTrie (f :+: g) b)
forall a. a -> Maybe a
Just (GTrie (f :+: g) b -> Maybe (GTrie (f :+: g) b))
-> GTrie (f :+: g) b -> Maybe (GTrie (f :+: g) b)
forall a b. (a -> b) -> a -> b
$! GTrie g b -> GTrie (f :+: g) b
forall (f :: * -> *) (g :: * -> *) a.
GTrie g a -> GTrie (f :+: g) a
STrieR GTrie g b
y'
(Just x' :: GTrie f b
x', Just y' :: GTrie g b
y') -> GTrie (f :+: g) b -> Maybe (GTrie (f :+: g) b)
forall a. a -> Maybe a
Just (GTrie (f :+: g) b -> Maybe (GTrie (f :+: g) b))
-> GTrie (f :+: g) b -> Maybe (GTrie (f :+: g) b)
forall a b. (a -> b) -> a -> b
$! GTrie f b -> GTrie g b -> GTrie (f :+: g) b
forall (f :: * -> *) (g :: * -> *) a.
GTrie f a -> GTrie g a -> GTrie (f :+: g) a
STrieB GTrie f b
x' GTrie g b
y'
gfoldWithKey :: ((:+:) f g p -> a -> r -> r) -> r -> GTrie (f :+: g) a -> r
gfoldWithKey f :: (:+:) f g p -> a -> r -> r
f z :: r
z (STrieL x) = (f p -> a -> r -> r) -> r -> GTrie f a -> r
forall (f :: * -> *) p a r.
GTrieKey f =>
(f p -> a -> r -> r) -> r -> GTrie f a -> r
gfoldWithKey ((:+:) f g p -> a -> r -> r
f ((:+:) f g p -> a -> r -> r)
-> (f p -> (:+:) f g p) -> f p -> a -> r -> r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. f p -> (:+:) f g p
forall k (f :: k -> *) (g :: k -> *) (p :: k). f p -> (:+:) f g p
L1) r
z GTrie f a
x
gfoldWithKey f :: (:+:) f g p -> a -> r -> r
f z :: r
z (STrieR y) = (g p -> a -> r -> r) -> r -> GTrie g a -> r
forall (f :: * -> *) p a r.
GTrieKey f =>
(f p -> a -> r -> r) -> r -> GTrie f a -> r
gfoldWithKey ((:+:) f g p -> a -> r -> r
f ((:+:) f g p -> a -> r -> r)
-> (g p -> (:+:) f g p) -> g p -> a -> r -> r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. g p -> (:+:) f g p
forall k (f :: k -> *) (g :: k -> *) (p :: k). g p -> (:+:) f g p
R1) r
z GTrie g a
y
gfoldWithKey f :: (:+:) f g p -> a -> r -> r
f z :: r
z (STrieB x y) = (f p -> a -> r -> r) -> r -> GTrie f a -> r
forall (f :: * -> *) p a r.
GTrieKey f =>
(f p -> a -> r -> r) -> r -> GTrie f a -> r
gfoldWithKey ((:+:) f g p -> a -> r -> r
f ((:+:) f g p -> a -> r -> r)
-> (f p -> (:+:) f g p) -> f p -> a -> r -> r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. f p -> (:+:) f g p
forall k (f :: k -> *) (g :: k -> *) (p :: k). f p -> (:+:) f g p
L1) ((g p -> a -> r -> r) -> r -> GTrie g a -> r
forall (f :: * -> *) p a r.
GTrieKey f =>
(f p -> a -> r -> r) -> r -> GTrie f a -> r
gfoldWithKey ((:+:) f g p -> a -> r -> r
f ((:+:) f g p -> a -> r -> r)
-> (g p -> (:+:) f g p) -> g p -> a -> r -> r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. g p -> (:+:) f g p
forall k (f :: k -> *) (g :: k -> *) (p :: k). g p -> (:+:) f g p
R1) r
z GTrie g a
y) GTrie f a
x
gtraverseWithKey :: ((:+:) f g p -> a -> m b)
-> GTrie (f :+: g) a -> m (GTrie (f :+: g) b)
gtraverseWithKey f :: (:+:) f g p -> a -> m b
f (STrieL x) = (GTrie f b -> GTrie (f :+: g) b)
-> m (GTrie f b) -> m (GTrie (f :+: g) b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap GTrie f b -> GTrie (f :+: g) b
forall (f :: * -> *) (g :: * -> *) a.
GTrie f a -> GTrie (f :+: g) a
STrieL ((f p -> a -> m b) -> GTrie f a -> m (GTrie f b)
forall (f :: * -> *) (m :: * -> *) p a b.
(GTrieKey f, Applicative m) =>
(f p -> a -> m b) -> GTrie f a -> m (GTrie f b)
gtraverseWithKey ((:+:) f g p -> a -> m b
f ((:+:) f g p -> a -> m b)
-> (f p -> (:+:) f g p) -> f p -> a -> m b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. f p -> (:+:) f g p
forall k (f :: k -> *) (g :: k -> *) (p :: k). f p -> (:+:) f g p
L1) GTrie f a
x)
gtraverseWithKey f :: (:+:) f g p -> a -> m b
f (STrieR y) = (GTrie g b -> GTrie (f :+: g) b)
-> m (GTrie g b) -> m (GTrie (f :+: g) b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap GTrie g b -> GTrie (f :+: g) b
forall (f :: * -> *) (g :: * -> *) a.
GTrie g a -> GTrie (f :+: g) a
STrieR ((g p -> a -> m b) -> GTrie g a -> m (GTrie g b)
forall (f :: * -> *) (m :: * -> *) p a b.
(GTrieKey f, Applicative m) =>
(f p -> a -> m b) -> GTrie f a -> m (GTrie f b)
gtraverseWithKey ((:+:) f g p -> a -> m b
f ((:+:) f g p -> a -> m b)
-> (g p -> (:+:) f g p) -> g p -> a -> m b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. g p -> (:+:) f g p
forall k (f :: k -> *) (g :: k -> *) (p :: k). g p -> (:+:) f g p
R1) GTrie g a
y)
gtraverseWithKey f :: (:+:) f g p -> a -> m b
f (STrieB x y) = (GTrie f b -> GTrie g b -> GTrie (f :+: g) b)
-> m (GTrie f b) -> m (GTrie g b) -> m (GTrie (f :+: g) b)
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 GTrie f b -> GTrie g b -> GTrie (f :+: g) b
forall (f :: * -> *) (g :: * -> *) a.
GTrie f a -> GTrie g a -> GTrie (f :+: g) a
STrieB ((f p -> a -> m b) -> GTrie f a -> m (GTrie f b)
forall (f :: * -> *) (m :: * -> *) p a b.
(GTrieKey f, Applicative m) =>
(f p -> a -> m b) -> GTrie f a -> m (GTrie f b)
gtraverseWithKey ((:+:) f g p -> a -> m b
f ((:+:) f g p -> a -> m b)
-> (f p -> (:+:) f g p) -> f p -> a -> m b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. f p -> (:+:) f g p
forall k (f :: k -> *) (g :: k -> *) (p :: k). f p -> (:+:) f g p
L1) GTrie f a
x)
((g p -> a -> m b) -> GTrie g a -> m (GTrie g b)
forall (f :: * -> *) (m :: * -> *) p a b.
(GTrieKey f, Applicative m) =>
(f p -> a -> m b) -> GTrie f a -> m (GTrie f b)
gtraverseWithKey ((:+:) f g p -> a -> m b
f ((:+:) f g p -> a -> m b)
-> (g p -> (:+:) f g p) -> g p -> a -> m b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. g p -> (:+:) f g p
forall k (f :: k -> *) (g :: k -> *) (p :: k). g p -> (:+:) f g p
R1) GTrie g a
y)
gmergeWithKey :: ((:+:) f g p -> a -> b -> Maybe c)
-> (GTrie (f :+: g) a -> Maybe (GTrie (f :+: g) c))
-> (GTrie (f :+: g) b -> Maybe (GTrie (f :+: g) c))
-> GTrie (f :+: g) a
-> GTrie (f :+: g) b
-> Maybe (GTrie (f :+: g) c)
gmergeWithKey f :: (:+:) f g p -> a -> b -> Maybe c
f g :: GTrie (f :+: g) a -> Maybe (GTrie (f :+: g) c)
g h :: GTrie (f :+: g) b -> Maybe (GTrie (f :+: g) c)
h x0 :: GTrie (f :+: g) a
x0 y0 :: GTrie (f :+: g) b
y0 =
case (GTrie (f :+: g) a -> (Maybe (GTrie f a), Maybe (GTrie g a))
forall (f :: * -> *) (g :: * -> *) a.
GTrie (f :+: g) a -> (Maybe (GTrie f a), Maybe (GTrie g a))
split GTrie (f :+: g) a
x0, GTrie (f :+: g) b -> (Maybe (GTrie f b), Maybe (GTrie g b))
forall (f :: * -> *) (g :: * -> *) a.
GTrie (f :+: g) a -> (Maybe (GTrie f a), Maybe (GTrie g a))
split GTrie (f :+: g) b
y0) of
((xl :: Maybe (GTrie f a)
xl,xr :: Maybe (GTrie g a)
xr),(yl :: Maybe (GTrie f b)
yl,yr :: Maybe (GTrie g b)
yr)) -> Maybe (GTrie f c) -> Maybe (GTrie g c) -> Maybe (GTrie (f :+: g) c)
forall (f :: * -> *) a (g :: * -> *).
Maybe (GTrie f a) -> Maybe (GTrie g a) -> Maybe (GTrie (f :+: g) a)
build (Maybe (GTrie f a) -> Maybe (GTrie f b) -> Maybe (GTrie f c)
mergel Maybe (GTrie f a)
xl Maybe (GTrie f b)
yl) (Maybe (GTrie g a) -> Maybe (GTrie g b) -> Maybe (GTrie g c)
merger Maybe (GTrie g a)
xr Maybe (GTrie g b)
yr)
where
split :: GTrie (f :+: g) a -> (Maybe (GTrie f a), Maybe (GTrie g a))
split (STrieL x) = (GTrie f a -> Maybe (GTrie f a)
forall a. a -> Maybe a
Just GTrie f a
x, Maybe (GTrie g a)
forall a. Maybe a
Nothing)
split (STrieR y) = (Maybe (GTrie f a)
forall a. Maybe a
Nothing, GTrie g a -> Maybe (GTrie g a)
forall a. a -> Maybe a
Just GTrie g a
y)
split (STrieB x y) = (GTrie f a -> Maybe (GTrie f a)
forall a. a -> Maybe a
Just GTrie f a
x, GTrie g a -> Maybe (GTrie g a)
forall a. a -> Maybe a
Just GTrie g a
y)
build :: Maybe (GTrie f a) -> Maybe (GTrie g a) -> Maybe (GTrie (f :+: g) a)
build (Just x :: GTrie f a
x) (Just y :: GTrie g a
y) = GTrie (f :+: g) a -> Maybe (GTrie (f :+: g) a)
forall a. a -> Maybe a
Just (GTrie f a -> GTrie g a -> GTrie (f :+: g) a
forall (f :: * -> *) (g :: * -> *) a.
GTrie f a -> GTrie g a -> GTrie (f :+: g) a
STrieB GTrie f a
x GTrie g a
y)
build (Just x :: GTrie f a
x) Nothing = GTrie (f :+: g) a -> Maybe (GTrie (f :+: g) a)
forall a. a -> Maybe a
Just (GTrie f a -> GTrie (f :+: g) a
forall (f :: * -> *) (g :: * -> *) a.
GTrie f a -> GTrie (f :+: g) a
STrieL GTrie f a
x)
build Nothing (Just y :: GTrie g a
y) = GTrie (f :+: g) a -> Maybe (GTrie (f :+: g) a)
forall a. a -> Maybe a
Just (GTrie g a -> GTrie (f :+: g) a
forall (f :: * -> *) (g :: * -> *) a.
GTrie g a -> GTrie (f :+: g) a
STrieR GTrie g a
y)
build Nothing Nothing = Maybe (GTrie (f :+: g) a)
forall a. Maybe a
Nothing
mergel :: Maybe (GTrie f a) -> Maybe (GTrie f b) -> Maybe (GTrie f c)
mergel Nothing Nothing = Maybe (GTrie f c)
forall a. Maybe a
Nothing
mergel (Just x :: GTrie f a
x) Nothing = GTrie f a -> Maybe (GTrie f c)
gl GTrie f a
x
mergel Nothing (Just y :: GTrie f b
y) = GTrie f b -> Maybe (GTrie f c)
hl GTrie f b
y
mergel (Just x :: GTrie f a
x) (Just y :: GTrie f b
y) = (f p -> a -> b -> Maybe c)
-> (GTrie f a -> Maybe (GTrie f c))
-> (GTrie f b -> Maybe (GTrie f c))
-> GTrie f a
-> GTrie f b
-> Maybe (GTrie f c)
forall (f :: * -> *) p a b c.
GTrieKey f =>
(f p -> a -> b -> Maybe c)
-> (GTrie f a -> Maybe (GTrie f c))
-> (GTrie f b -> Maybe (GTrie f c))
-> GTrie f a
-> GTrie f b
-> Maybe (GTrie f c)
gmergeWithKey ((:+:) f g p -> a -> b -> Maybe c
f ((:+:) f g p -> a -> b -> Maybe c)
-> (f p -> (:+:) f g p) -> f p -> a -> b -> Maybe c
forall b c a. (b -> c) -> (a -> b) -> a -> c
. f p -> (:+:) f g p
forall k (f :: k -> *) (g :: k -> *) (p :: k). f p -> (:+:) f g p
L1) GTrie f a -> Maybe (GTrie f c)
gl GTrie f b -> Maybe (GTrie f c)
hl GTrie f a
x GTrie f b
y
merger :: Maybe (GTrie g a) -> Maybe (GTrie g b) -> Maybe (GTrie g c)
merger Nothing Nothing = Maybe (GTrie g c)
forall a. Maybe a
Nothing
merger (Just x :: GTrie g a
x) Nothing = GTrie g a -> Maybe (GTrie g c)
gr GTrie g a
x
merger Nothing (Just y :: GTrie g b
y) = GTrie g b -> Maybe (GTrie g c)
hr GTrie g b
y
merger (Just x :: GTrie g a
x) (Just y :: GTrie g b
y) = (g p -> a -> b -> Maybe c)
-> (GTrie g a -> Maybe (GTrie g c))
-> (GTrie g b -> Maybe (GTrie g c))
-> GTrie g a
-> GTrie g b
-> Maybe (GTrie g c)
forall (f :: * -> *) p a b c.
GTrieKey f =>
(f p -> a -> b -> Maybe c)
-> (GTrie f a -> Maybe (GTrie f c))
-> (GTrie f b -> Maybe (GTrie f c))
-> GTrie f a
-> GTrie f b
-> Maybe (GTrie f c)
gmergeWithKey ((:+:) f g p -> a -> b -> Maybe c
f ((:+:) f g p -> a -> b -> Maybe c)
-> (g p -> (:+:) f g p) -> g p -> a -> b -> Maybe c
forall b c a. (b -> c) -> (a -> b) -> a -> c
. g p -> (:+:) f g p
forall k (f :: k -> *) (g :: k -> *) (p :: k). g p -> (:+:) f g p
R1) GTrie g a -> Maybe (GTrie g c)
gr GTrie g b -> Maybe (GTrie g c)
hr GTrie g a
x GTrie g b
y
gl :: GTrie f a -> Maybe (GTrie f c)
gl t :: GTrie f a
t = do STrieL t' <- GTrie (f :+: g) a -> Maybe (GTrie (f :+: g) c)
g (GTrie f a -> GTrie (f :+: g) a
forall (f :: * -> *) (g :: * -> *) a.
GTrie f a -> GTrie (f :+: g) a
STrieL GTrie f a
t)
GTrie f c -> Maybe (GTrie f c)
forall (m :: * -> *) a. Monad m => a -> m a
return GTrie f c
t'
gr :: GTrie g a -> Maybe (GTrie g c)
gr t :: GTrie g a
t = do STrieR t' <- GTrie (f :+: g) a -> Maybe (GTrie (f :+: g) c)
g (GTrie g a -> GTrie (f :+: g) a
forall (f :: * -> *) (g :: * -> *) a.
GTrie g a -> GTrie (f :+: g) a
STrieR GTrie g a
t)
GTrie g c -> Maybe (GTrie g c)
forall (m :: * -> *) a. Monad m => a -> m a
return GTrie g c
t'
hl :: GTrie f b -> Maybe (GTrie f c)
hl t :: GTrie f b
t = do STrieL t' <- GTrie (f :+: g) b -> Maybe (GTrie (f :+: g) c)
h (GTrie f b -> GTrie (f :+: g) b
forall (f :: * -> *) (g :: * -> *) a.
GTrie f a -> GTrie (f :+: g) a
STrieL GTrie f b
t)
GTrie f c -> Maybe (GTrie f c)
forall (m :: * -> *) a. Monad m => a -> m a
return GTrie f c
t'
hr :: GTrie g b -> Maybe (GTrie g c)
hr t :: GTrie g b
t = do STrieR t' <- GTrie (f :+: g) b -> Maybe (GTrie (f :+: g) c)
h (GTrie g b -> GTrie (f :+: g) b
forall (f :: * -> *) (g :: * -> *) a.
GTrie g a -> GTrie (f :+: g) a
STrieR GTrie g b
t)
GTrie g c -> Maybe (GTrie g c)
forall (m :: * -> *) a. Monad m => a -> m a
return GTrie g c
t'
{-# INLINE gtrieLookup #-}
{-# INLINE gtrieInsert #-}
{-# INLINE gtrieDelete #-}
{-# INLINE gtrieSingleton #-}
{-# INLINE gtrieTraverse #-}
{-# INLINE gtrieMap #-}
{-# INLINE gfoldWithKey #-}
{-# INLINE gtraverseWithKey #-}
{-# INLINE gmergeWithKey #-}
{-# INLINE gmapMaybeWithKey #-}
instance (GTrieKeyShow f, GTrieKeyShow g) => GTrieKeyShow (f :+: g) where
gtrieShowsPrec :: Int -> GTrie (f :+: g) a -> ShowS
gtrieShowsPrec p :: Int
p (STrieB x y) = Bool -> ShowS -> ShowS
showParen (Int
p Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> 10)
(ShowS -> ShowS) -> ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ String -> ShowS
showString "STrieB "
ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> GTrie f a -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec 11 GTrie f a
x
ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ShowS
showString " "
ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> GTrie g a -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec 11 GTrie g a
y
gtrieShowsPrec p :: Int
p (STrieL x) = Bool -> ShowS -> ShowS
showParen (Int
p Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> 10)
(ShowS -> ShowS) -> ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ String -> ShowS
showString "STrieL "
ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> GTrie f a -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec 11 GTrie f a
x
gtrieShowsPrec p :: Int
p (STrieR y) = Bool -> ShowS -> ShowS
showParen (Int
p Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> 10)
(ShowS -> ShowS) -> ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ String -> ShowS
showString "STrieR "
ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> GTrie g a -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec 11 GTrie g a
y
instance GTrieKey U1 where
gtrieLookup :: U1 p -> GTrie U1 a -> Maybe a
gtrieLookup _ (UTrie x) = a -> Maybe a
forall a. a -> Maybe a
Just a
x
gtrieInsert :: U1 p -> a -> GTrie U1 a -> GTrie U1 a
gtrieInsert _ v :: a
v _ = a -> GTrie U1 a
forall a. a -> GTrie U1 a
UTrie a
v
gtrieDelete :: U1 p -> GTrie U1 a -> Maybe (GTrie U1 a)
gtrieDelete _ _ = Maybe (GTrie U1 a)
forall a. Maybe a
Nothing
gtrieSingleton :: U1 p -> a -> GTrie U1 a
gtrieSingleton _ = a -> GTrie U1 a
forall a. a -> GTrie U1 a
UTrie
gtrieMap :: (a -> b) -> GTrie U1 a -> GTrie U1 b
gtrieMap f :: a -> b
f (UTrie x) = b -> GTrie U1 b
forall a. a -> GTrie U1 a
UTrie (a -> b
f a
x)
gtrieTraverse :: (a -> m b) -> GTrie U1 a -> m (GTrie U1 b)
gtrieTraverse f :: a -> m b
f (UTrie x) = (b -> GTrie U1 b) -> m b -> m (GTrie U1 b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap b -> GTrie U1 b
forall a. a -> GTrie U1 a
UTrie (a -> m b
f a
x)
gmapMaybeWithKey :: (U1 p -> a -> Maybe b) -> GTrie U1 a -> Maybe (GTrie U1 b)
gmapMaybeWithKey f :: U1 p -> a -> Maybe b
f (UTrie x) = (b -> GTrie U1 b) -> Maybe b -> Maybe (GTrie U1 b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap b -> GTrie U1 b
forall a. a -> GTrie U1 a
UTrie (Maybe b -> Maybe (GTrie U1 b)) -> Maybe b -> Maybe (GTrie U1 b)
forall a b. (a -> b) -> a -> b
$! U1 p -> a -> Maybe b
f U1 p
forall k (p :: k). U1 p
U1 a
x
gfoldWithKey :: (U1 p -> a -> r -> r) -> r -> GTrie U1 a -> r
gfoldWithKey f :: U1 p -> a -> r -> r
f z :: r
z (UTrie x) = U1 p -> a -> r -> r
f U1 p
forall k (p :: k). U1 p
U1 a
x r
z
gtraverseWithKey :: (U1 p -> a -> m b) -> GTrie U1 a -> m (GTrie U1 b)
gtraverseWithKey f :: U1 p -> a -> m b
f (UTrie x) = (b -> GTrie U1 b) -> m b -> m (GTrie U1 b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap b -> GTrie U1 b
forall a. a -> GTrie U1 a
UTrie (U1 p -> a -> m b
f U1 p
forall k (p :: k). U1 p
U1 a
x)
gmergeWithKey :: (U1 p -> a -> b -> Maybe c)
-> (GTrie U1 a -> Maybe (GTrie U1 c))
-> (GTrie U1 b -> Maybe (GTrie U1 c))
-> GTrie U1 a
-> GTrie U1 b
-> Maybe (GTrie U1 c)
gmergeWithKey f :: U1 p -> a -> b -> Maybe c
f _ _ (UTrie x) (UTrie y) = (c -> GTrie U1 c) -> Maybe c -> Maybe (GTrie U1 c)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap c -> GTrie U1 c
forall a. a -> GTrie U1 a
UTrie (Maybe c -> Maybe (GTrie U1 c)) -> Maybe c -> Maybe (GTrie U1 c)
forall a b. (a -> b) -> a -> b
$! U1 p -> a -> b -> Maybe c
f U1 p
forall k (p :: k). U1 p
U1 a
x b
y
{-# INLINE gtrieLookup #-}
{-# INLINE gtrieInsert #-}
{-# INLINE gtrieDelete #-}
{-# INLINE gtrieSingleton #-}
{-# INLINE gtrieTraverse #-}
{-# INLINE gtrieMap #-}
{-# INLINE gfoldWithKey #-}
{-# INLINE gtraverseWithKey #-}
{-# INLINE gmergeWithKey #-}
{-# INLINE gmapMaybeWithKey #-}
instance GTrieKeyShow U1 where
gtrieShowsPrec :: Int -> GTrie U1 a -> ShowS
gtrieShowsPrec p :: Int
p (UTrie x) = Int -> a -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
p a
x
instance GTrieKey V1 where
gtrieLookup :: V1 p -> GTrie V1 a -> Maybe a
gtrieLookup k :: V1 p
k t :: GTrie V1 a
t = V1 p
k V1 p -> Maybe a -> Maybe a
forall a b. a -> b -> b
`seq` GTrie V1 a
t GTrie V1 a -> Maybe a -> Maybe a
forall a b. a -> b -> b
`seq` String -> Maybe a
forall a. HasCallStack => String -> a
error "GTrieKey.V1: gtrieLookup"
gtrieInsert :: V1 p -> a -> GTrie V1 a -> GTrie V1 a
gtrieInsert k :: V1 p
k _ t :: GTrie V1 a
t = V1 p
k V1 p -> GTrie V1 a -> GTrie V1 a
forall a b. a -> b -> b
`seq` GTrie V1 a
t GTrie V1 a -> GTrie V1 a -> GTrie V1 a
forall a b. a -> b -> b
`seq` String -> GTrie V1 a
forall a. HasCallStack => String -> a
error "GTrieKey.V1: gtrieInsert"
gtrieDelete :: V1 p -> GTrie V1 a -> Maybe (GTrie V1 a)
gtrieDelete k :: V1 p
k t :: GTrie V1 a
t = V1 p
k V1 p -> Maybe (GTrie V1 a) -> Maybe (GTrie V1 a)
forall a b. a -> b -> b
`seq` GTrie V1 a
t GTrie V1 a -> Maybe (GTrie V1 a) -> Maybe (GTrie V1 a)
forall a b. a -> b -> b
`seq` String -> Maybe (GTrie V1 a)
forall a. HasCallStack => String -> a
error "GTrieKey.V1: gtrieDelete"
gtrieSingleton :: V1 p -> a -> GTrie V1 a
gtrieSingleton k :: V1 p
k _ = V1 p
k V1 p -> GTrie V1 a -> GTrie V1 a
forall a b. a -> b -> b
`seq` String -> GTrie V1 a
forall a. HasCallStack => String -> a
error "GTrieKey.V1: gtrieSingleton"
gtrieMap :: (a -> b) -> GTrie V1 a -> GTrie V1 b
gtrieMap _ t :: GTrie V1 a
t = GTrie V1 a
t GTrie V1 a -> GTrie V1 b -> GTrie V1 b
forall a b. a -> b -> b
`seq` String -> GTrie V1 b
forall a. HasCallStack => String -> a
error "GTrieKey.V1: gtrieMap"
gtrieTraverse :: (a -> m b) -> GTrie V1 a -> m (GTrie V1 b)
gtrieTraverse _ t :: GTrie V1 a
t = GTrie V1 a
t GTrie V1 a -> m (GTrie V1 b) -> m (GTrie V1 b)
forall a b. a -> b -> b
`seq` String -> m (GTrie V1 b)
forall a. HasCallStack => String -> a
error "GTrieKey.V1: gtrieTraverse"
gmapMaybeWithKey :: (V1 p -> a -> Maybe b) -> GTrie V1 a -> Maybe (GTrie V1 b)
gmapMaybeWithKey _ t :: GTrie V1 a
t = GTrie V1 a
t GTrie V1 a -> Maybe (GTrie V1 b) -> Maybe (GTrie V1 b)
forall a b. a -> b -> b
`seq` String -> Maybe (GTrie V1 b)
forall a. HasCallStack => String -> a
error "GTrieKey.V1: gmapMaybeWithKey"
gfoldWithKey :: (V1 p -> a -> r -> r) -> r -> GTrie V1 a -> r
gfoldWithKey _ _ t :: GTrie V1 a
t = GTrie V1 a
t GTrie V1 a -> r -> r
forall a b. a -> b -> b
`seq` String -> r
forall a. HasCallStack => String -> a
error "GTrieKey.V1: gmapFoldWithKey"
gtraverseWithKey :: (V1 p -> a -> m b) -> GTrie V1 a -> m (GTrie V1 b)
gtraverseWithKey _ t :: GTrie V1 a
t = GTrie V1 a
t GTrie V1 a -> m (GTrie V1 b) -> m (GTrie V1 b)
forall a b. a -> b -> b
`seq` String -> m (GTrie V1 b)
forall a. HasCallStack => String -> a
error "GTrieKey.V1: gtraverseWithKey"
gmergeWithKey :: (V1 p -> a -> b -> Maybe c)
-> (GTrie V1 a -> Maybe (GTrie V1 c))
-> (GTrie V1 b -> Maybe (GTrie V1 c))
-> GTrie V1 a
-> GTrie V1 b
-> Maybe (GTrie V1 c)
gmergeWithKey _ _ _ t :: GTrie V1 a
t u :: GTrie V1 b
u = GTrie V1 a
t GTrie V1 a -> Maybe (GTrie V1 c) -> Maybe (GTrie V1 c)
forall a b. a -> b -> b
`seq` GTrie V1 b
u GTrie V1 b -> Maybe (GTrie V1 c) -> Maybe (GTrie V1 c)
forall a b. a -> b -> b
`seq` String -> Maybe (GTrie V1 c)
forall a. HasCallStack => String -> a
error "GTrieKey.V1: gmergeWithKey"
{-# INLINE gtrieLookup #-}
{-# INLINE gtrieInsert #-}
{-# INLINE gtrieDelete #-}
{-# INLINE gtrieSingleton #-}
{-# INLINE gtrieMap #-}
{-# INLINE gtrieTraverse #-}
{-# INLINE gfoldWithKey #-}
{-# INLINE gtraverseWithKey #-}
{-# INLINE gmergeWithKey #-}
{-# INLINE gmapMaybeWithKey #-}
instance GTrieKeyShow V1 where
gtrieShowsPrec :: Int -> GTrie V1 a -> ShowS
gtrieShowsPrec _ _ = String -> ShowS
showString "()"
instance (Show a, TrieKey k) => Show (Trie k a) where
showsPrec :: Int -> Trie k a -> ShowS
showsPrec = Int -> Trie k a -> ShowS
forall k a. (TrieKey k, Show a) => Int -> Trie k a -> ShowS
trieShowsPrec
instance (Show a, GTrieKeyShow f) => Show (GTrie f a) where
showsPrec :: Int -> GTrie f a -> ShowS
showsPrec = Int -> GTrie f a -> ShowS
forall (f :: * -> *) a.
(GTrieKeyShow f, Show a) =>
Int -> GTrie f a -> ShowS
gtrieShowsPrec
instance TrieKey k => Functor (Trie k) where
fmap :: (a -> b) -> Trie k a -> Trie k b
fmap = (a -> b) -> Trie k a -> Trie k b
forall k a b. TrieKey k => (a -> b) -> Trie k a -> Trie k b
trieMap
instance TrieKey k => Foldable (Trie k) where
foldr :: (a -> b -> b) -> b -> Trie k a -> b
foldr f :: a -> b -> b
f = (k -> a -> b -> b) -> b -> Trie k a -> b
forall k a r. TrieKey k => (k -> a -> r -> r) -> r -> Trie k a -> r
trieFoldWithKey (\_ -> a -> b -> b
f)
instance TrieKey k => Traversable (Trie k) where
traverse :: (a -> f b) -> Trie k a -> f (Trie k b)
traverse = (a -> f b) -> Trie k a -> f (Trie k b)
forall k (f :: * -> *) a b.
(TrieKey k, Applicative f) =>
(a -> f b) -> Trie k a -> f (Trie k b)
trieTraverse