{-# LANGUAGE UndecidableInstances, FlexibleInstances,
MultiParamTypeClasses, TemplateHaskell, RankNTypes,
FunctionalDependencies, DeriveDataTypeable,
GADTs, CPP, ScopedTypeVariables, KindSignatures,
DataKinds, TypeOperators, StandaloneDeriving,
TypeFamilies, ScopedTypeVariables, ConstraintKinds,
FunctionalDependencies, FlexibleContexts, BangPatterns #-}
#if __GLASGOW_HASKELL__ < 710
{-# LANGUAGE OverlappingInstances #-}
#endif
#if __GLASGOW_HASKELL__ >= 800
{-# LANGUAGE UndecidableSuperClasses #-}
#endif
module Data.IxSet.Typed
(
IxSet(),
IxList(),
Indexable(..),
IsIndexOf(),
All,
Ix(),
ixList,
MkIxList(),
ixFun,
ixGen,
noCalcs,
inferIxSet,
IndexOp,
SetOp,
change,
insert,
insertList,
delete,
updateIx,
deleteIx,
empty,
fromSet,
fromList,
toSet,
toList,
toAscList,
toDescList,
getOne,
getOneOr,
size,
null,
(&&&),
(|||),
union,
intersection,
(@=),
(@<),
(@>),
(@<=),
(@>=),
(@><),
(@>=<),
(@><=),
(@>=<=),
(@+),
(@*),
getEQ,
getLT,
getGT,
getLTE,
getGTE,
getRange,
groupBy,
groupAscBy,
groupDescBy,
indexKeys,
flatten,
flattenWithCalcs,
stats
)
where
import Prelude hiding (null)
import Control.Arrow (first, second)
import Control.DeepSeq
import Data.Foldable (Foldable)
import qualified Data.Foldable as Fold
import Data.Generics (Data, gmapQ)
import qualified Data.IxSet.Typed.Ix as Ix
import Data.IxSet.Typed.Ix (Ix(Ix))
import qualified Data.List as List
import Data.Map (Map)
import qualified Data.Map as Map
import Data.Maybe (fromMaybe)
import Data.Monoid (Monoid(mempty, mappend))
import Data.SafeCopy (SafeCopy(..), contain, safeGet, safePut)
import Data.Semigroup (Semigroup(..))
import Data.Set (Set)
import qualified Data.Set as Set
import Data.Typeable (Typeable, cast )
import Language.Haskell.TH as TH
import GHC.Exts (Constraint)
data IxSet (ixs :: [*]) (a :: *) where
IxSet :: !(Set a) -> !(IxList ixs a) -> IxSet ixs a
data IxList (ixs :: [*]) (a :: *) where
Nil :: IxList '[] a
(:::) :: Ix ix a -> IxList ixs a -> IxList (ix ': ixs) a
infixr 5 :::
(!:::) :: Ix ix a -> IxList ixs a -> IxList (ix ': ixs) a
!::: :: Ix ix a -> IxList ixs a -> IxList (ix : ixs) a
(!:::) !Ix ix a
ix !IxList ixs a
ixs = Ix ix a
ix Ix ix a -> IxList ixs a -> IxList (ix : ixs) a
forall ix a (ixs :: [*]).
Ix ix a -> IxList ixs a -> IxList (ix : ixs) a
::: IxList ixs a
ixs
infixr 5 !:::
type family All (c :: * -> Constraint) (xs :: [*]) :: Constraint
type instance All c '[] = ()
type instance All c (x ': xs) = (c x, All c xs)
class (All Ord ixs, Ord a) => Indexable ixs a where
indices :: IxList ixs a
class Ord ix => IsIndexOf (ix :: *) (ixs :: [*]) where
access :: IxList ixs a -> Ix ix a
mapAt :: (All Ord ixs)
=> (Ix ix a -> Ix ix a)
-> (forall ix'. Ord ix' => Ix ix' a -> Ix ix' a)
-> IxList ixs a -> IxList ixs a
instance
#if __GLASGOW_HASKELL__ >= 710
{-# OVERLAPPING #-}
#endif
Ord ix => IsIndexOf ix (ix ': ixs) where
access :: IxList (ix : ixs) a -> Ix ix a
access (x :: Ix ix a
x ::: _xs :: IxList ixs a
_xs) = Ix ix a
Ix ix a
x
mapAt :: (Ix ix a -> Ix ix a)
-> (forall ix'. Ord ix' => Ix ix' a -> Ix ix' a)
-> IxList (ix : ixs) a
-> IxList (ix : ixs) a
mapAt fh :: Ix ix a -> Ix ix a
fh ft :: forall ix'. Ord ix' => Ix ix' a -> Ix ix' a
ft (x :: Ix ix a
x ::: xs :: IxList ixs a
xs) = Ix ix a -> Ix ix a
fh Ix ix a
Ix ix a
x Ix ix a -> IxList ixs a -> IxList (ix : ixs) a
forall ix a (ixs :: [*]).
Ix ix a -> IxList ixs a -> IxList (ix : ixs) a
::: (forall ix'. Ord ix' => Ix ix' a -> Ix ix' a)
-> IxList ixs a -> IxList ixs a
forall (ixs :: [*]) a.
All Ord ixs =>
(forall ix. Ord ix => Ix ix a -> Ix ix a)
-> IxList ixs a -> IxList ixs a
mapIxList forall ix'. Ord ix' => Ix ix' a -> Ix ix' a
ft IxList ixs a
xs
instance
#if __GLASGOW_HASKELL__ >= 710
{-# OVERLAPPABLE #-}
#endif
IsIndexOf ix ixs => IsIndexOf ix (ix' ': ixs) where
access :: IxList (ix' : ixs) a -> Ix ix a
access (_x :: Ix ix a
_x ::: xs :: IxList ixs a
xs) = IxList ixs a -> Ix ix a
forall ix (ixs :: [*]) a.
IsIndexOf ix ixs =>
IxList ixs a -> Ix ix a
access IxList ixs a
xs
mapAt :: (Ix ix a -> Ix ix a)
-> (forall ix'. Ord ix' => Ix ix' a -> Ix ix' a)
-> IxList (ix' : ixs) a
-> IxList (ix' : ixs) a
mapAt fh :: Ix ix a -> Ix ix a
fh ft :: forall ix'. Ord ix' => Ix ix' a -> Ix ix' a
ft (x :: Ix ix a
x ::: xs :: IxList ixs a
xs) = Ix ix a -> Ix ix a
forall ix'. Ord ix' => Ix ix' a -> Ix ix' a
ft Ix ix a
x Ix ix a -> IxList ixs a -> IxList (ix : ixs) a
forall ix a (ixs :: [*]).
Ix ix a -> IxList ixs a -> IxList (ix : ixs) a
::: (Ix ix a -> Ix ix a)
-> (forall ix'. Ord ix' => Ix ix' a -> Ix ix' a)
-> IxList ixs a
-> IxList ixs a
forall ix (ixs :: [*]) a.
(IsIndexOf ix ixs, All Ord ixs) =>
(Ix ix a -> Ix ix a)
-> (forall ix'. Ord ix' => Ix ix' a -> Ix ix' a)
-> IxList ixs a
-> IxList ixs a
mapAt Ix ix a -> Ix ix a
fh forall ix'. Ord ix' => Ix ix' a -> Ix ix' a
ft IxList ixs a
xs
lengthIxList :: forall ixs a. IxList ixs a -> Int
lengthIxList :: IxList ixs a -> Int
lengthIxList = Int -> IxList ixs a -> Int
forall (ixs' :: [*]). Int -> IxList ixs' a -> Int
go 0
where
go :: forall ixs'. Int -> IxList ixs' a -> Int
go :: Int -> IxList ixs' a -> Int
go !Int
acc Nil = Int
acc
go !Int
acc (_ ::: xs :: IxList ixs a
xs) = Int -> IxList ixs a -> Int
forall (ixs' :: [*]). Int -> IxList ixs' a -> Int
go (Int
acc Int -> Int -> Int
forall a. Num a => a -> a -> a
+ 1) IxList ixs a
xs
ixListToList :: All Ord ixs
=> (forall ix. Ord ix => Ix ix a -> r)
-> IxList ixs a -> [r]
ixListToList :: (forall ix. Ord ix => Ix ix a -> r) -> IxList ixs a -> [r]
ixListToList _ Nil = []
ixListToList f :: forall ix. Ord ix => Ix ix a -> r
f (x :: Ix ix a
x ::: xs :: IxList ixs a
xs) = Ix ix a -> r
forall ix. Ord ix => Ix ix a -> r
f Ix ix a
x r -> [r] -> [r]
forall a. a -> [a] -> [a]
: (forall ix. Ord ix => Ix ix a -> r) -> IxList ixs a -> [r]
forall (ixs :: [*]) a r.
All Ord ixs =>
(forall ix. Ord ix => Ix ix a -> r) -> IxList ixs a -> [r]
ixListToList forall ix. Ord ix => Ix ix a -> r
f IxList ixs a
xs
mapIxList :: All Ord ixs
=> (forall ix. Ord ix => Ix ix a -> Ix ix a)
-> IxList ixs a -> IxList ixs a
mapIxList :: (forall ix. Ord ix => Ix ix a -> Ix ix a)
-> IxList ixs a -> IxList ixs a
mapIxList _ Nil = IxList ixs a
forall a. IxList '[] a
Nil
mapIxList f :: forall ix. Ord ix => Ix ix a -> Ix ix a
f (x :: Ix ix a
x ::: xs :: IxList ixs a
xs) = Ix ix a -> Ix ix a
forall ix. Ord ix => Ix ix a -> Ix ix a
f Ix ix a
x Ix ix a -> IxList ixs a -> IxList (ix : ixs) a
forall ix a (ixs :: [*]).
Ix ix a -> IxList ixs a -> IxList (ix : ixs) a
::: (forall ix. Ord ix => Ix ix a -> Ix ix a)
-> IxList ixs a -> IxList ixs a
forall (ixs :: [*]) a.
All Ord ixs =>
(forall ix. Ord ix => Ix ix a -> Ix ix a)
-> IxList ixs a -> IxList ixs a
mapIxList forall ix. Ord ix => Ix ix a -> Ix ix a
f IxList ixs a
xs
mapIxList' :: All Ord ixs
=> (forall ix. Ord ix => Ix ix a -> Ix ix a)
-> IxList ixs a -> IxList ixs a
mapIxList' :: (forall ix. Ord ix => Ix ix a -> Ix ix a)
-> IxList ixs a -> IxList ixs a
mapIxList' _ Nil = IxList ixs a
forall a. IxList '[] a
Nil
mapIxList' f :: forall ix. Ord ix => Ix ix a -> Ix ix a
f (x :: Ix ix a
x ::: xs :: IxList ixs a
xs) = Ix ix a -> Ix ix a
forall ix. Ord ix => Ix ix a -> Ix ix a
f Ix ix a
x Ix ix a -> IxList ixs a -> IxList (ix : ixs) a
forall ix a (ixs :: [*]).
Ix ix a -> IxList ixs a -> IxList (ix : ixs) a
!::: (forall ix. Ord ix => Ix ix a -> Ix ix a)
-> IxList ixs a -> IxList ixs a
forall (ixs :: [*]) a.
All Ord ixs =>
(forall ix. Ord ix => Ix ix a -> Ix ix a)
-> IxList ixs a -> IxList ixs a
mapIxList' forall ix. Ord ix => Ix ix a -> Ix ix a
f IxList ixs a
xs
zipWithIxList' :: All Ord ixs
=> (forall ix. Ord ix => Ix ix a -> Ix ix a -> Ix ix a)
-> IxList ixs a -> IxList ixs a -> IxList ixs a
zipWithIxList' :: (forall ix. Ord ix => Ix ix a -> Ix ix a -> Ix ix a)
-> IxList ixs a -> IxList ixs a -> IxList ixs a
zipWithIxList' _ Nil Nil = IxList ixs a
forall a. IxList '[] a
Nil
zipWithIxList' f :: forall ix. Ord ix => Ix ix a -> Ix ix a -> Ix ix a
f (x :: Ix ix a
x ::: xs :: IxList ixs a
xs) (y :: Ix ix a
y ::: ys :: IxList ixs a
ys) = Ix ix a -> Ix ix a -> Ix ix a
forall ix. Ord ix => Ix ix a -> Ix ix a -> Ix ix a
f Ix ix a
x Ix ix a
Ix ix a
y Ix ix a -> IxList ixs a -> IxList (ix : ixs) a
forall ix a (ixs :: [*]).
Ix ix a -> IxList ixs a -> IxList (ix : ixs) a
!::: (forall ix. Ord ix => Ix ix a -> Ix ix a -> Ix ix a)
-> IxList ixs a -> IxList ixs a -> IxList ixs a
forall (ixs :: [*]) a.
All Ord ixs =>
(forall ix. Ord ix => Ix ix a -> Ix ix a -> Ix ix a)
-> IxList ixs a -> IxList ixs a -> IxList ixs a
zipWithIxList' forall ix. Ord ix => Ix ix a -> Ix ix a -> Ix ix a
f IxList ixs a
xs IxList ixs a
IxList ixs a
ys
#if __GLASGOW_HASKELL__ < 800
zipWithIxList' _ _ _ = error "Data.IxSet.Typed.zipWithIxList: impossible"
#endif
instance Indexable ixs a => Eq (IxSet ixs a) where
IxSet a :: Set a
a _ == :: IxSet ixs a -> IxSet ixs a -> Bool
== IxSet b :: Set a
b _ = Set a
a Set a -> Set a -> Bool
forall a. Eq a => a -> a -> Bool
== Set a
b
instance Indexable ixs a => Ord (IxSet ixs a) where
compare :: IxSet ixs a -> IxSet ixs a -> Ordering
compare (IxSet a :: Set a
a _) (IxSet b :: Set a
b _) = Set a -> Set a -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Set a
a Set a
b
instance (Indexable ixs a, Show a) => Show (IxSet ixs a) where
showsPrec :: Int -> IxSet ixs a -> ShowS
showsPrec prec :: Int
prec = Int -> Set a -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
prec (Set a -> ShowS) -> (IxSet ixs a -> Set a) -> IxSet ixs a -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IxSet ixs a -> Set a
forall (ixs :: [*]) a. IxSet ixs a -> Set a
toSet
instance (Indexable ixs a, Read a) => Read (IxSet ixs a) where
readsPrec :: Int -> ReadS (IxSet ixs a)
readsPrec n :: Int
n = ((Set a, String) -> (IxSet ixs a, String))
-> [(Set a, String)] -> [(IxSet ixs a, String)]
forall a b. (a -> b) -> [a] -> [b]
map ((Set a -> IxSet ixs a) -> (Set a, String) -> (IxSet ixs a, String)
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (b, d) (c, d)
first Set a -> IxSet ixs a
forall (ixs :: [*]) a. Indexable ixs a => Set a -> IxSet ixs a
fromSet) ([(Set a, String)] -> [(IxSet ixs a, String)])
-> (String -> [(Set a, String)]) -> ReadS (IxSet ixs a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> String -> [(Set a, String)]
forall a. Read a => Int -> ReadS a
readsPrec Int
n
instance (Indexable ixs a, Typeable ixs, SafeCopy a, Typeable a) => SafeCopy (IxSet ixs a) where
putCopy :: IxSet ixs a -> Contained Put
putCopy = Put -> Contained Put
forall a. a -> Contained a
contain (Put -> Contained Put)
-> (IxSet ixs a -> Put) -> IxSet ixs a -> Contained Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> Put
forall a. SafeCopy a => a -> Put
safePut ([a] -> Put) -> (IxSet ixs a -> [a]) -> IxSet ixs a -> Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IxSet ixs a -> [a]
forall (ixs :: [*]) a. IxSet ixs a -> [a]
toList
getCopy :: Contained (Get (IxSet ixs a))
getCopy = Get (IxSet ixs a) -> Contained (Get (IxSet ixs a))
forall a. a -> Contained a
contain (Get (IxSet ixs a) -> Contained (Get (IxSet ixs a)))
-> Get (IxSet ixs a) -> Contained (Get (IxSet ixs a))
forall a b. (a -> b) -> a -> b
$ ([a] -> IxSet ixs a) -> Get [a] -> Get (IxSet ixs a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [a] -> IxSet ixs a
forall (ixs :: [*]) a. Indexable ixs a => [a] -> IxSet ixs a
fromList Get [a]
forall a. SafeCopy a => Get a
safeGet
instance (All NFData ixs, NFData a) => NFData (IxList ixs a) where
rnf :: IxList ixs a -> ()
rnf Nil = ()
rnf (x :: Ix ix a
x ::: xs :: IxList ixs a
xs) = Ix ix a -> ()
forall a. NFData a => a -> ()
rnf Ix ix a
x () -> () -> ()
forall a b. a -> b -> b
`seq` IxList ixs a -> ()
forall a. NFData a => a -> ()
rnf IxList ixs a
xs
instance (All NFData ixs, NFData a) => NFData (IxSet ixs a) where
rnf :: IxSet ixs a -> ()
rnf (IxSet a :: Set a
a ixs :: IxList ixs a
ixs) = Set a -> ()
forall a. NFData a => a -> ()
rnf Set a
a () -> () -> ()
forall a b. a -> b -> b
`seq` IxList ixs a -> ()
forall a. NFData a => a -> ()
rnf IxList ixs a
ixs
instance Indexable ixs a => Semigroup (IxSet ixs a) where
<> :: IxSet ixs a -> IxSet ixs a -> IxSet ixs a
(<>) = IxSet ixs a -> IxSet ixs a -> IxSet ixs a
forall a. Monoid a => a -> a -> a
mappend
instance Indexable ixs a => Monoid (IxSet ixs a) where
mempty :: IxSet ixs a
mempty = IxSet ixs a
forall (ixs :: [*]) a. Indexable ixs a => IxSet ixs a
empty
mappend :: IxSet ixs a -> IxSet ixs a -> IxSet ixs a
mappend = IxSet ixs a -> IxSet ixs a -> IxSet ixs a
forall (ixs :: [*]) a.
Indexable ixs a =>
IxSet ixs a -> IxSet ixs a -> IxSet ixs a
union
instance Foldable (IxSet ixs) where
fold :: IxSet ixs m -> m
fold = Set m -> m
forall (t :: * -> *) m. (Foldable t, Monoid m) => t m -> m
Fold.fold (Set m -> m) -> (IxSet ixs m -> Set m) -> IxSet ixs m -> m
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IxSet ixs m -> Set m
forall (ixs :: [*]) a. IxSet ixs a -> Set a
toSet
foldMap :: (a -> m) -> IxSet ixs a -> m
foldMap f :: a -> m
f = (a -> m) -> Set a -> m
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
Fold.foldMap a -> m
f (Set a -> m) -> (IxSet ixs a -> Set a) -> IxSet ixs a -> m
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IxSet ixs a -> Set a
forall (ixs :: [*]) a. IxSet ixs a -> Set a
toSet
foldr :: (a -> b -> b) -> b -> IxSet ixs a -> b
foldr f :: a -> b -> b
f z :: b
z = (a -> b -> b) -> b -> Set a -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
Fold.foldr a -> b -> b
f b
z (Set a -> b) -> (IxSet ixs a -> Set a) -> IxSet ixs a -> b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IxSet ixs a -> Set a
forall (ixs :: [*]) a. IxSet ixs a -> Set a
toSet
foldl :: (b -> a -> b) -> b -> IxSet ixs a -> b
foldl f :: b -> a -> b
f z :: b
z = (b -> a -> b) -> b -> Set a -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
Fold.foldl b -> a -> b
f b
z (Set a -> b) -> (IxSet ixs a -> Set a) -> IxSet ixs a -> b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IxSet ixs a -> Set a
forall (ixs :: [*]) a. IxSet ixs a -> Set a
toSet
empty :: Indexable ixs a => IxSet ixs a
empty :: IxSet ixs a
empty = Set a -> IxList ixs a -> IxSet ixs a
forall a (ixs :: [*]). Set a -> IxList ixs a -> IxSet ixs a
IxSet Set a
forall a. Set a
Set.empty IxList ixs a
forall (ixs :: [*]) a. Indexable ixs a => IxList ixs a
indices
ixList :: MkIxList ixs ixs a r => r
ixList :: r
ixList = (IxList ixs a -> IxList ixs a) -> r
forall (ixs :: [*]) (ixs' :: [*]) a r.
MkIxList ixs ixs' a r =>
(IxList ixs a -> IxList ixs' a) -> r
ixList' IxList ixs a -> IxList ixs a
forall a. a -> a
id
class MkIxList ixs ixs' a r | r -> a ixs ixs' where
ixList' :: (IxList ixs a -> IxList ixs' a) -> r
instance MkIxList '[] ixs a (IxList ixs a) where
ixList' :: (IxList '[] a -> IxList ixs a) -> IxList ixs a
ixList' acc :: IxList '[] a -> IxList ixs a
acc = IxList '[] a -> IxList ixs a
acc IxList '[] a
forall a. IxList '[] a
Nil
instance MkIxList ixs ixs' a r => MkIxList (ix ': ixs) ixs' a (Ix ix a -> r) where
ixList' :: (IxList (ix : ixs) a -> IxList ixs' a) -> Ix ix a -> r
ixList' acc :: IxList (ix : ixs) a -> IxList ixs' a
acc ix :: Ix ix a
ix = (IxList ixs a -> IxList ixs' a) -> r
forall (ixs :: [*]) (ixs' :: [*]) a r.
MkIxList ixs ixs' a r =>
(IxList ixs a -> IxList ixs' a) -> r
ixList' (\ x :: IxList ixs a
x -> IxList (ix : ixs) a -> IxList ixs' a
acc (Ix ix a
ix Ix ix a -> IxList ixs a -> IxList (ix : ixs) a
forall ix a (ixs :: [*]).
Ix ix a -> IxList ixs a -> IxList (ix : ixs) a
::: IxList ixs a
x))
ixFun :: Ord ix => (a -> [ix]) -> Ix ix a
ixFun :: (a -> [ix]) -> Ix ix a
ixFun = Map ix (Set a) -> (a -> [ix]) -> Ix ix a
forall ix a. Map ix (Set a) -> (a -> [ix]) -> Ix ix a
Ix Map ix (Set a)
forall k a. Map k a
Map.empty
ixGen :: forall proxy a ix. (Ord ix, Data a, Typeable ix) => proxy ix -> Ix ix a
ixGen :: proxy ix -> Ix ix a
ixGen _proxy :: proxy ix
_proxy = (a -> [ix]) -> Ix ix a
forall ix a. Ord ix => (a -> [ix]) -> Ix ix a
ixFun (a -> [ix]
forall a b. (Typeable a, Data a, Typeable b) => a -> [b]
flatten :: a -> [ix])
noCalcs :: t -> ()
noCalcs :: t -> ()
noCalcs _ = ()
inferIxSet :: String -> TH.Name -> TH.Name -> [TH.Name] -> Q [Dec]
inferIxSet :: String -> Name -> Name -> [Name] -> Q [Dec]
inferIxSet _ _ _ [] = String -> Q [Dec]
forall a. HasCallStack => String -> a
error "inferIxSet needs at least one index"
inferIxSet ixset :: String
ixset typeName :: Name
typeName calName :: Name
calName entryPoints :: [Name]
entryPoints
= do Info
calInfo <- Name -> Q Info
reify Name
calName
Info
typeInfo <- Name -> Q Info
reify Name
typeName
let (context :: Cxt
context,binders :: [TyVarBndr]
binders) = case Info
typeInfo of
#if MIN_VERSION_template_haskell(2,11,0)
TyConI (DataD ctxt :: Cxt
ctxt _ nms :: [TyVarBndr]
nms _ _ _) -> (Cxt
ctxt,[TyVarBndr]
nms)
TyConI (NewtypeD ctxt :: Cxt
ctxt _ nms :: [TyVarBndr]
nms _ _ _) -> (Cxt
ctxt,[TyVarBndr]
nms)
#else
TyConI (DataD ctxt _ nms _ _) -> (ctxt,nms)
TyConI (NewtypeD ctxt _ nms _ _) -> (ctxt,nms)
#endif
TyConI (TySynD _ nms :: [TyVarBndr]
nms _) -> ([],[TyVarBndr]
nms)
_ -> String -> (Cxt, [TyVarBndr])
forall a. HasCallStack => String -> a
error "IxSet.inferIxSet typeInfo unexpected match"
names :: [Name]
names = (TyVarBndr -> Name) -> [TyVarBndr] -> [Name]
forall a b. (a -> b) -> [a] -> [b]
map TyVarBndr -> Name
tyVarBndrToName [TyVarBndr]
binders
typeCon :: TypeQ
typeCon = (TypeQ -> TypeQ -> TypeQ) -> TypeQ -> [TypeQ] -> TypeQ
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
List.foldl' TypeQ -> TypeQ -> TypeQ
appT (Name -> TypeQ
conT Name
typeName) ((Name -> TypeQ) -> [Name] -> [TypeQ]
forall a b. (a -> b) -> [a] -> [b]
map Name -> TypeQ
varT [Name]
names)
#if MIN_VERSION_template_haskell(2,10,0)
mkCtx :: Name -> t TypeQ -> TypeQ
mkCtx c :: Name
c = (TypeQ -> TypeQ -> TypeQ) -> TypeQ -> t TypeQ -> TypeQ
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
List.foldl' TypeQ -> TypeQ -> TypeQ
appT (Name -> TypeQ
conT Name
c)
#else
mkCtx = classP
#endif
dataCtxConQ :: [TypeQ]
dataCtxConQ = [[TypeQ]] -> [TypeQ]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [[Name -> [TypeQ] -> TypeQ
forall (t :: * -> *). Foldable t => Name -> t TypeQ -> TypeQ
mkCtx ''Data [Name -> TypeQ
varT Name
name], Name -> [TypeQ] -> TypeQ
forall (t :: * -> *). Foldable t => Name -> t TypeQ -> TypeQ
mkCtx ''Ord [Name -> TypeQ
varT Name
name]] | Name
name <- [Name]
names]
fullContext :: Q Cxt
fullContext = do
Cxt
dataCtxCon <- [TypeQ] -> Q Cxt
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
sequence [TypeQ]
dataCtxConQ
Cxt -> Q Cxt
forall (m :: * -> *) a. Monad m => a -> m a
return (Cxt
context Cxt -> Cxt -> Cxt
forall a. [a] -> [a] -> [a]
++ Cxt
dataCtxCon)
case Info
calInfo of
#if MIN_VERSION_template_haskell(2,11,0)
VarI _ _t :: Type
_t _ ->
#else
VarI _ _t _ _ ->
#endif
let
mkEntryPoint :: Name -> ExpQ
mkEntryPoint n :: Name
n = (Name -> ExpQ
conE 'Ix) ExpQ -> ExpQ -> ExpQ
`appE`
(ExpQ -> TypeQ -> ExpQ
sigE (Name -> ExpQ
varE 'Map.empty) ([TyVarBndr] -> Q Cxt -> TypeQ -> TypeQ
forallT [TyVarBndr]
binders (Cxt -> Q Cxt
forall (m :: * -> *) a. Monad m => a -> m a
return Cxt
context) (TypeQ -> TypeQ) -> TypeQ -> TypeQ
forall a b. (a -> b) -> a -> b
$
TypeQ -> TypeQ -> TypeQ
appT (TypeQ -> TypeQ -> TypeQ
appT (Name -> TypeQ
conT ''Map) (Name -> TypeQ
conT Name
n))
(TypeQ -> TypeQ -> TypeQ
appT (Name -> TypeQ
conT ''Set) TypeQ
typeCon))) ExpQ -> ExpQ -> ExpQ
`appE`
(Name -> ExpQ
varE 'flattenWithCalcs ExpQ -> ExpQ -> ExpQ
`appE` Name -> ExpQ
varE Name
calName)
mkTypeList :: [TypeQ] -> TypeQ
mkTypeList :: [TypeQ] -> TypeQ
mkTypeList = (TypeQ -> TypeQ -> TypeQ) -> TypeQ -> [TypeQ] -> TypeQ
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\ x :: TypeQ
x xs :: TypeQ
xs -> TypeQ
promotedConsT TypeQ -> TypeQ -> TypeQ
`appT` TypeQ
x TypeQ -> TypeQ -> TypeQ
`appT` TypeQ
xs) TypeQ
promotedNilT
typeList :: TypeQ
typeList :: TypeQ
typeList = [TypeQ] -> TypeQ
mkTypeList ((Name -> TypeQ) -> [Name] -> [TypeQ]
forall a b. (a -> b) -> [a] -> [b]
map Name -> TypeQ
conT [Name]
entryPoints)
in do Dec
i <- Q Cxt -> TypeQ -> [DecQ] -> DecQ
instanceD (Q Cxt
fullContext)
(Name -> TypeQ
conT ''Indexable TypeQ -> TypeQ -> TypeQ
`appT` TypeQ
typeList TypeQ -> TypeQ -> TypeQ
`appT` TypeQ
typeCon)
[PatQ -> BodyQ -> [DecQ] -> DecQ
valD (Name -> PatQ
varP 'indices) (ExpQ -> BodyQ
normalB ([ExpQ] -> ExpQ
appsE ([| ixList |] ExpQ -> [ExpQ] -> [ExpQ]
forall a. a -> [a] -> [a]
: (Name -> ExpQ) -> [Name] -> [ExpQ]
forall a b. (a -> b) -> [a] -> [b]
map Name -> ExpQ
mkEntryPoint [Name]
entryPoints))) []]
let ixType :: TypeQ
ixType = Name -> TypeQ
conT ''IxSet TypeQ -> TypeQ -> TypeQ
`appT` TypeQ
typeList TypeQ -> TypeQ -> TypeQ
`appT` TypeQ
typeCon
Dec
ixType' <- Name -> [TyVarBndr] -> TypeQ -> DecQ
tySynD (String -> Name
mkName String
ixset) [TyVarBndr]
binders TypeQ
ixType
[Dec] -> Q [Dec]
forall (m :: * -> *) a. Monad m => a -> m a
return ([Dec] -> Q [Dec]) -> [Dec] -> Q [Dec]
forall a b. (a -> b) -> a -> b
$ [Dec
i, Dec
ixType']
_ -> String -> Q [Dec]
forall a. HasCallStack => String -> a
error "IxSet.inferIxSet calInfo unexpected match"
tyVarBndrToName :: TyVarBndr -> Name
tyVarBndrToName :: TyVarBndr -> Name
tyVarBndrToName (PlainTV nm :: Name
nm) = Name
nm
tyVarBndrToName (KindedTV nm :: Name
nm _) = Name
nm
flatten :: (Typeable a, Data a, Typeable b) => a -> [b]
flatten :: a -> [b]
flatten x :: a
x = case a -> Maybe String
forall a b. (Typeable a, Typeable b) => a -> Maybe b
cast a
x of
Just y :: String
y -> case String -> Maybe b
forall a b. (Typeable a, Typeable b) => a -> Maybe b
cast (String
y :: String) of
Just v :: b
v -> [b
v]
Nothing -> []
Nothing -> case a -> Maybe b
forall a b. (Typeable a, Typeable b) => a -> Maybe b
cast a
x of
Just v :: b
v -> b
v b -> [b] -> [b]
forall a. a -> [a] -> [a]
: [[b]] -> [b]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ((forall d. Data d => d -> [b]) -> a -> [[b]]
forall a u. Data a => (forall d. Data d => d -> u) -> a -> [u]
gmapQ forall d. Data d => d -> [b]
forall a b. (Typeable a, Data a, Typeable b) => a -> [b]
flatten a
x)
Nothing -> [[b]] -> [b]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ((forall d. Data d => d -> [b]) -> a -> [[b]]
forall a u. Data a => (forall d. Data d => d -> u) -> a -> [u]
gmapQ forall d. Data d => d -> [b]
forall a b. (Typeable a, Data a, Typeable b) => a -> [b]
flatten a
x)
flattenWithCalcs :: (Data c,Typeable a, Data a, Typeable b) => (a -> c) -> a -> [b]
flattenWithCalcs :: (a -> c) -> a -> [b]
flattenWithCalcs calcs :: a -> c
calcs x :: a
x = (a, c) -> [b]
forall a b. (Typeable a, Data a, Typeable b) => a -> [b]
flatten (a
x,a -> c
calcs a
x)
type SetOp =
forall a. Ord a => a -> Set a -> Set a
type IndexOp =
forall k a. (Ord k,Ord a) => k -> a -> Map k (Set a) -> Map k (Set a)
change :: forall ixs a. Indexable ixs a
=> SetOp -> IndexOp -> a -> IxSet ixs a -> IxSet ixs a
change :: SetOp -> IndexOp -> a -> IxSet ixs a -> IxSet ixs a
change opS :: SetOp
opS opI :: IndexOp
opI x :: a
x (IxSet a :: Set a
a indexes :: IxList ixs a
indexes) = Set a -> IxList ixs a -> IxSet ixs a
forall a (ixs :: [*]). Set a -> IxList ixs a -> IxSet ixs a
IxSet (a -> Set a -> Set a
SetOp
opS a
x Set a
a) IxList ixs a
v
where
v :: IxList ixs a
v :: IxList ixs a
v = (forall ix. Ord ix => Ix ix a -> Ix ix a)
-> IxList ixs a -> IxList ixs a
forall (ixs :: [*]) a.
All Ord ixs =>
(forall ix. Ord ix => Ix ix a -> Ix ix a)
-> IxList ixs a -> IxList ixs a
mapIxList' forall ix. Ord ix => Ix ix a -> Ix ix a
update IxList ixs a
indexes
update :: forall ix. Ord ix => Ix ix a -> Ix ix a
update :: Ix ix a -> Ix ix a
update (Ix index :: Map ix (Set a)
index f :: a -> [ix]
f) = Map ix (Set a) -> (a -> [ix]) -> Ix ix a
forall ix a. Map ix (Set a) -> (a -> [ix]) -> Ix ix a
Ix Map ix (Set a)
index' a -> [ix]
f
where
ds :: [ix]
ds :: [ix]
ds = a -> [ix]
f a
x
ii :: forall k. Ord k => Map k (Set a) -> k -> Map k (Set a)
ii :: Map k (Set a) -> k -> Map k (Set a)
ii m :: Map k (Set a)
m dkey :: k
dkey = k -> a -> Map k (Set a) -> Map k (Set a)
IndexOp
opI k
dkey a
x Map k (Set a)
m
index' :: Map ix (Set a)
index' :: Map ix (Set a)
index' = (Map ix (Set a) -> ix -> Map ix (Set a))
-> Map ix (Set a) -> [ix] -> Map ix (Set a)
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
List.foldl' Map ix (Set a) -> ix -> Map ix (Set a)
forall k. Ord k => Map k (Set a) -> k -> Map k (Set a)
ii Map ix (Set a)
index [ix]
ds
insertList :: forall ixs a. Indexable ixs a
=> [a] -> IxSet ixs a -> IxSet ixs a
insertList :: [a] -> IxSet ixs a -> IxSet ixs a
insertList xs :: [a]
xs (IxSet a :: Set a
a indexes :: IxList ixs a
indexes) = Set a -> IxList ixs a -> IxSet ixs a
forall a (ixs :: [*]). Set a -> IxList ixs a -> IxSet ixs a
IxSet ((Set a -> a -> Set a) -> Set a -> [a] -> Set a
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
List.foldl' (\ b :: Set a
b x :: a
x -> a -> Set a -> Set a
SetOp
Set.insert a
x Set a
b) Set a
a [a]
xs) IxList ixs a
v
where
v :: IxList ixs a
v :: IxList ixs a
v = (forall ix. Ord ix => Ix ix a -> Ix ix a)
-> IxList ixs a -> IxList ixs a
forall (ixs :: [*]) a.
All Ord ixs =>
(forall ix. Ord ix => Ix ix a -> Ix ix a)
-> IxList ixs a -> IxList ixs a
mapIxList' forall ix. Ord ix => Ix ix a -> Ix ix a
update IxList ixs a
indexes
update :: forall ix. Ord ix => Ix ix a -> Ix ix a
update :: Ix ix a -> Ix ix a
update (Ix index :: Map ix (Set a)
index f :: a -> [ix]
f) = Map ix (Set a) -> (a -> [ix]) -> Ix ix a
forall ix a. Map ix (Set a) -> (a -> [ix]) -> Ix ix a
Ix Map ix (Set a)
index' a -> [ix]
f
where
dss :: [(ix, a)]
dss :: [(ix, a)]
dss = [(ix
k, a
x) | a
x <- [a]
xs, ix
k <- a -> [ix]
f a
x]
index' :: Map ix (Set a)
index' :: Map ix (Set a)
index' = [(ix, a)] -> Map ix (Set a) -> Map ix (Set a)
forall a k.
(Ord a, Ord k) =>
[(k, a)] -> Map k (Set a) -> Map k (Set a)
Ix.insertList [(ix, a)]
dss Map ix (Set a)
index
fromMapOfSets :: forall ixs ix a. (Indexable ixs a, IsIndexOf ix ixs)
=> Map ix (Set a) -> IxSet ixs a
fromMapOfSets :: Map ix (Set a) -> IxSet ixs a
fromMapOfSets partialindex :: Map ix (Set a)
partialindex =
Set a -> IxList ixs a -> IxSet ixs a
forall a (ixs :: [*]). Set a -> IxList ixs a -> IxSet ixs a
IxSet Set a
a ((Ix ix a -> Ix ix a)
-> (forall ix'. Ord ix' => Ix ix' a -> Ix ix' a)
-> IxList ixs a
-> IxList ixs a
forall ix (ixs :: [*]) a.
(IsIndexOf ix ixs, All Ord ixs) =>
(Ix ix a -> Ix ix a)
-> (forall ix'. Ord ix' => Ix ix' a -> Ix ix' a)
-> IxList ixs a
-> IxList ixs a
mapAt Ix ix a -> Ix ix a
updateh forall ix'. Ord ix' => Ix ix' a -> Ix ix' a
updatet IxList ixs a
forall (ixs :: [*]) a. Indexable ixs a => IxList ixs a
indices)
where
a :: Set a
a :: Set a
a = [Set a] -> Set a
forall (f :: * -> *) a. (Foldable f, Ord a) => f (Set a) -> Set a
Set.unions (Map ix (Set a) -> [Set a]
forall k a. Map k a -> [a]
Map.elems Map ix (Set a)
partialindex)
xs :: [a]
xs :: [a]
xs = Set a -> [a]
forall a. Set a -> [a]
Set.toList Set a
a
updateh :: Ix ix a -> Ix ix a
updateh :: Ix ix a -> Ix ix a
updateh (Ix _ f :: a -> [ix]
f) = Map ix (Set a) -> (a -> [ix]) -> Ix ix a
forall ix a. Map ix (Set a) -> (a -> [ix]) -> Ix ix a
Ix Map ix (Set a)
ix a -> [ix]
f
where
dss :: [(ix, a)]
dss :: [(ix, a)]
dss = [(ix
k, a
x) | a
x <- [a]
xs, ix
k <- a -> [ix]
f a
x, Bool -> Bool
not (ix -> Map ix (Set a) -> Bool
forall k a. Ord k => k -> Map k a -> Bool
Map.member ix
k Map ix (Set a)
partialindex)]
ix :: Map ix (Set a)
ix :: Map ix (Set a)
ix = [(ix, a)] -> Map ix (Set a) -> Map ix (Set a)
forall a k.
(Ord a, Ord k) =>
[(k, a)] -> Map k (Set a) -> Map k (Set a)
Ix.insertList [(ix, a)]
dss Map ix (Set a)
partialindex
updatet :: forall ix'. Ord ix' => Ix ix' a -> Ix ix' a
updatet :: Ix ix' a -> Ix ix' a
updatet (Ix _ f :: a -> [ix']
f) = Map ix' (Set a) -> (a -> [ix']) -> Ix ix' a
forall ix a. Map ix (Set a) -> (a -> [ix]) -> Ix ix a
Ix Map ix' (Set a)
ix a -> [ix']
f
where
dss :: [(ix', a)]
dss :: [(ix', a)]
dss = [(ix'
k, a
x) | a
x <- [a]
xs, ix'
k <- a -> [ix']
f a
x]
ix :: Map ix' (Set a)
ix :: Map ix' (Set a)
ix = [(ix', a)] -> Map ix' (Set a)
forall a k. (Ord a, Ord k) => [(k, a)] -> Map k (Set a)
Ix.fromList [(ix', a)]
dss
insert :: Indexable ixs a => a -> IxSet ixs a -> IxSet ixs a
insert :: a -> IxSet ixs a -> IxSet ixs a
insert = SetOp -> IndexOp -> a -> IxSet ixs a -> IxSet ixs a
forall (ixs :: [*]) a.
Indexable ixs a =>
SetOp -> IndexOp -> a -> IxSet ixs a -> IxSet ixs a
change SetOp
Set.insert IndexOp
forall a k.
(Ord a, Ord k) =>
k -> a -> Map k (Set a) -> Map k (Set a)
Ix.insert
delete :: Indexable ixs a => a -> IxSet ixs a -> IxSet ixs a
delete :: a -> IxSet ixs a -> IxSet ixs a
delete = SetOp -> IndexOp -> a -> IxSet ixs a -> IxSet ixs a
forall (ixs :: [*]) a.
Indexable ixs a =>
SetOp -> IndexOp -> a -> IxSet ixs a -> IxSet ixs a
change SetOp
Set.delete IndexOp
forall a k.
(Ord a, Ord k) =>
k -> a -> Map k (Set a) -> Map k (Set a)
Ix.delete
updateIx :: (Indexable ixs a, IsIndexOf ix ixs)
=> ix -> a -> IxSet ixs a -> IxSet ixs a
updateIx :: ix -> a -> IxSet ixs a -> IxSet ixs a
updateIx i :: ix
i new :: a
new ixset :: IxSet ixs a
ixset = a -> IxSet ixs a -> IxSet ixs a
forall (ixs :: [*]) a.
Indexable ixs a =>
a -> IxSet ixs a -> IxSet ixs a
insert a
new (IxSet ixs a -> IxSet ixs a) -> IxSet ixs a -> IxSet ixs a
forall a b. (a -> b) -> a -> b
$
IxSet ixs a -> (a -> IxSet ixs a) -> Maybe a -> IxSet ixs a
forall b a. b -> (a -> b) -> Maybe a -> b
maybe IxSet ixs a
ixset ((a -> IxSet ixs a -> IxSet ixs a)
-> IxSet ixs a -> a -> IxSet ixs a
forall a b c. (a -> b -> c) -> b -> a -> c
flip a -> IxSet ixs a -> IxSet ixs a
forall (ixs :: [*]) a.
Indexable ixs a =>
a -> IxSet ixs a -> IxSet ixs a
delete IxSet ixs a
ixset) (Maybe a -> IxSet ixs a) -> Maybe a -> IxSet ixs a
forall a b. (a -> b) -> a -> b
$
IxSet ixs a -> Maybe a
forall a (ixs :: [*]). Ord a => IxSet ixs a -> Maybe a
getOne (IxSet ixs a -> Maybe a) -> IxSet ixs a -> Maybe a
forall a b. (a -> b) -> a -> b
$ IxSet ixs a
ixset IxSet ixs a -> ix -> IxSet ixs a
forall (ixs :: [*]) a ix.
(Indexable ixs a, IsIndexOf ix ixs) =>
IxSet ixs a -> ix -> IxSet ixs a
@= ix
i
deleteIx :: (Indexable ixs a, IsIndexOf ix ixs)
=> ix -> IxSet ixs a -> IxSet ixs a
deleteIx :: ix -> IxSet ixs a -> IxSet ixs a
deleteIx i :: ix
i ixset :: IxSet ixs a
ixset = IxSet ixs a -> (a -> IxSet ixs a) -> Maybe a -> IxSet ixs a
forall b a. b -> (a -> b) -> Maybe a -> b
maybe IxSet ixs a
ixset ((a -> IxSet ixs a -> IxSet ixs a)
-> IxSet ixs a -> a -> IxSet ixs a
forall a b c. (a -> b -> c) -> b -> a -> c
flip a -> IxSet ixs a -> IxSet ixs a
forall (ixs :: [*]) a.
Indexable ixs a =>
a -> IxSet ixs a -> IxSet ixs a
delete IxSet ixs a
ixset) (Maybe a -> IxSet ixs a) -> Maybe a -> IxSet ixs a
forall a b. (a -> b) -> a -> b
$
IxSet ixs a -> Maybe a
forall a (ixs :: [*]). Ord a => IxSet ixs a -> Maybe a
getOne (IxSet ixs a -> Maybe a) -> IxSet ixs a -> Maybe a
forall a b. (a -> b) -> a -> b
$ IxSet ixs a
ixset IxSet ixs a -> ix -> IxSet ixs a
forall (ixs :: [*]) a ix.
(Indexable ixs a, IsIndexOf ix ixs) =>
IxSet ixs a -> ix -> IxSet ixs a
@= ix
i
toSet :: IxSet ixs a -> Set a
toSet :: IxSet ixs a -> Set a
toSet (IxSet a :: Set a
a _) = Set a
a
fromSet :: (Indexable ixs a) => Set a -> IxSet ixs a
fromSet :: Set a -> IxSet ixs a
fromSet = [a] -> IxSet ixs a
forall (ixs :: [*]) a. Indexable ixs a => [a] -> IxSet ixs a
fromList ([a] -> IxSet ixs a) -> (Set a -> [a]) -> Set a -> IxSet ixs a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Set a -> [a]
forall a. Set a -> [a]
Set.toList
fromList :: (Indexable ixs a) => [a] -> IxSet ixs a
fromList :: [a] -> IxSet ixs a
fromList list :: [a]
list = [a] -> IxSet ixs a -> IxSet ixs a
forall (ixs :: [*]) a.
Indexable ixs a =>
[a] -> IxSet ixs a -> IxSet ixs a
insertList [a]
list IxSet ixs a
forall (ixs :: [*]) a. Indexable ixs a => IxSet ixs a
empty
size :: IxSet ixs a -> Int
size :: IxSet ixs a -> Int
size = Set a -> Int
forall a. Set a -> Int
Set.size (Set a -> Int) -> (IxSet ixs a -> Set a) -> IxSet ixs a -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IxSet ixs a -> Set a
forall (ixs :: [*]) a. IxSet ixs a -> Set a
toSet
toList :: IxSet ixs a -> [a]
toList :: IxSet ixs a -> [a]
toList = Set a -> [a]
forall a. Set a -> [a]
Set.toList (Set a -> [a]) -> (IxSet ixs a -> Set a) -> IxSet ixs a -> [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IxSet ixs a -> Set a
forall (ixs :: [*]) a. IxSet ixs a -> Set a
toSet
toAscList :: forall proxy ix ixs a. IsIndexOf ix ixs => proxy ix -> IxSet ixs a -> [a]
toAscList :: proxy ix -> IxSet ixs a -> [a]
toAscList _ ixset :: IxSet ixs a
ixset = ((ix, [a]) -> [a]) -> [(ix, [a])] -> [a]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (ix, [a]) -> [a]
forall a b. (a, b) -> b
snd (IxSet ixs a -> [(ix, [a])]
forall ix (ixs :: [*]) a.
IsIndexOf ix ixs =>
IxSet ixs a -> [(ix, [a])]
groupAscBy IxSet ixs a
ixset :: [(ix, [a])])
toDescList :: forall proxy ix ixs a. IsIndexOf ix ixs => proxy ix -> IxSet ixs a -> [a]
toDescList :: proxy ix -> IxSet ixs a -> [a]
toDescList _ ixset :: IxSet ixs a
ixset = ((ix, [a]) -> [a]) -> [(ix, [a])] -> [a]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (ix, [a]) -> [a]
forall a b. (a, b) -> b
snd (IxSet ixs a -> [(ix, [a])]
forall ix (ixs :: [*]) a.
IsIndexOf ix ixs =>
IxSet ixs a -> [(ix, [a])]
groupDescBy IxSet ixs a
ixset :: [(ix, [a])])
getOne :: Ord a => IxSet ixs a -> Maybe a
getOne :: IxSet ixs a -> Maybe a
getOne ixset :: IxSet ixs a
ixset = case IxSet ixs a -> [a]
forall (ixs :: [*]) a. IxSet ixs a -> [a]
toList IxSet ixs a
ixset of
[x :: a
x] -> a -> Maybe a
forall a. a -> Maybe a
Just a
x
_ -> Maybe a
forall a. Maybe a
Nothing
getOneOr :: Ord a => a -> IxSet ixs a -> a
getOneOr :: a -> IxSet ixs a -> a
getOneOr def :: a
def = a -> Maybe a -> a
forall a. a -> Maybe a -> a
fromMaybe a
def (Maybe a -> a) -> (IxSet ixs a -> Maybe a) -> IxSet ixs a -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IxSet ixs a -> Maybe a
forall a (ixs :: [*]). Ord a => IxSet ixs a -> Maybe a
getOne
null :: IxSet ixs a -> Bool
null :: IxSet ixs a -> Bool
null (IxSet a :: Set a
a _) = Set a -> Bool
forall a. Set a -> Bool
Set.null Set a
a
(&&&) :: Indexable ixs a => IxSet ixs a -> IxSet ixs a -> IxSet ixs a
&&& :: IxSet ixs a -> IxSet ixs a -> IxSet ixs a
(&&&) = IxSet ixs a -> IxSet ixs a -> IxSet ixs a
forall (ixs :: [*]) a.
Indexable ixs a =>
IxSet ixs a -> IxSet ixs a -> IxSet ixs a
intersection
(|||) :: Indexable ixs a => IxSet ixs a -> IxSet ixs a -> IxSet ixs a
||| :: IxSet ixs a -> IxSet ixs a -> IxSet ixs a
(|||) = IxSet ixs a -> IxSet ixs a -> IxSet ixs a
forall (ixs :: [*]) a.
Indexable ixs a =>
IxSet ixs a -> IxSet ixs a -> IxSet ixs a
union
infixr 5 &&&
infixr 5 |||
union :: Indexable ixs a => IxSet ixs a -> IxSet ixs a -> IxSet ixs a
union :: IxSet ixs a -> IxSet ixs a -> IxSet ixs a
union (IxSet a1 :: Set a
a1 x1 :: IxList ixs a
x1) (IxSet a2 :: Set a
a2 x2 :: IxList ixs a
x2) =
Set a -> IxList ixs a -> IxSet ixs a
forall a (ixs :: [*]). Set a -> IxList ixs a -> IxSet ixs a
IxSet (Set a -> Set a -> Set a
forall a. Ord a => Set a -> Set a -> Set a
Set.union Set a
a1 Set a
a2)
((forall ix. Ord ix => Ix ix a -> Ix ix a -> Ix ix a)
-> IxList ixs a -> IxList ixs a -> IxList ixs a
forall (ixs :: [*]) a.
All Ord ixs =>
(forall ix. Ord ix => Ix ix a -> Ix ix a -> Ix ix a)
-> IxList ixs a -> IxList ixs a -> IxList ixs a
zipWithIxList' (\ (Ix a :: Map ix (Set a)
a f :: a -> [ix]
f) (Ix b :: Map ix (Set a)
b _) -> Map ix (Set a) -> (a -> [ix]) -> Ix ix a
forall ix a. Map ix (Set a) -> (a -> [ix]) -> Ix ix a
Ix (Map ix (Set a) -> Map ix (Set a) -> Map ix (Set a)
forall a k.
(Ord a, Ord k) =>
Map k (Set a) -> Map k (Set a) -> Map k (Set a)
Ix.union Map ix (Set a)
a Map ix (Set a)
b) a -> [ix]
f) IxList ixs a
x1 IxList ixs a
x2)
intersection :: Indexable ixs a => IxSet ixs a -> IxSet ixs a -> IxSet ixs a
intersection :: IxSet ixs a -> IxSet ixs a -> IxSet ixs a
intersection (IxSet a1 :: Set a
a1 x1 :: IxList ixs a
x1) (IxSet a2 :: Set a
a2 x2 :: IxList ixs a
x2) =
Set a -> IxList ixs a -> IxSet ixs a
forall a (ixs :: [*]). Set a -> IxList ixs a -> IxSet ixs a
IxSet (Set a -> Set a -> Set a
forall a. Ord a => Set a -> Set a -> Set a
Set.intersection Set a
a1 Set a
a2)
((forall ix. Ord ix => Ix ix a -> Ix ix a -> Ix ix a)
-> IxList ixs a -> IxList ixs a -> IxList ixs a
forall (ixs :: [*]) a.
All Ord ixs =>
(forall ix. Ord ix => Ix ix a -> Ix ix a -> Ix ix a)
-> IxList ixs a -> IxList ixs a -> IxList ixs a
zipWithIxList' (\ (Ix a :: Map ix (Set a)
a f :: a -> [ix]
f) (Ix b :: Map ix (Set a)
b _) -> Map ix (Set a) -> (a -> [ix]) -> Ix ix a
forall ix a. Map ix (Set a) -> (a -> [ix]) -> Ix ix a
Ix (Map ix (Set a) -> Map ix (Set a) -> Map ix (Set a)
forall a k.
(Ord a, Ord k) =>
Map k (Set a) -> Map k (Set a) -> Map k (Set a)
Ix.intersection Map ix (Set a)
a Map ix (Set a)
b) a -> [ix]
f) IxList ixs a
x1 IxList ixs a
x2)
(@=) :: (Indexable ixs a, IsIndexOf ix ixs)
=> IxSet ixs a -> ix -> IxSet ixs a
ix :: IxSet ixs a
ix @= :: IxSet ixs a -> ix -> IxSet ixs a
@= v :: ix
v = ix -> IxSet ixs a -> IxSet ixs a
forall (ixs :: [*]) a ix.
(Indexable ixs a, IsIndexOf ix ixs) =>
ix -> IxSet ixs a -> IxSet ixs a
getEQ ix
v IxSet ixs a
ix
(@<) :: (Indexable ixs a, IsIndexOf ix ixs)
=> IxSet ixs a -> ix -> IxSet ixs a
ix :: IxSet ixs a
ix @< :: IxSet ixs a -> ix -> IxSet ixs a
@< v :: ix
v = ix -> IxSet ixs a -> IxSet ixs a
forall (ixs :: [*]) a ix.
(Indexable ixs a, IsIndexOf ix ixs) =>
ix -> IxSet ixs a -> IxSet ixs a
getLT ix
v IxSet ixs a
ix
(@>) :: (Indexable ixs a, IsIndexOf ix ixs)
=> IxSet ixs a -> ix -> IxSet ixs a
ix :: IxSet ixs a
ix @> :: IxSet ixs a -> ix -> IxSet ixs a
@> v :: ix
v = ix -> IxSet ixs a -> IxSet ixs a
forall (ixs :: [*]) a ix.
(Indexable ixs a, IsIndexOf ix ixs) =>
ix -> IxSet ixs a -> IxSet ixs a
getGT ix
v IxSet ixs a
ix
(@<=) :: (Indexable ixs a, IsIndexOf ix ixs)
=> IxSet ixs a -> ix -> IxSet ixs a
ix :: IxSet ixs a
ix @<= :: IxSet ixs a -> ix -> IxSet ixs a
@<= v :: ix
v = ix -> IxSet ixs a -> IxSet ixs a
forall (ixs :: [*]) a ix.
(Indexable ixs a, IsIndexOf ix ixs) =>
ix -> IxSet ixs a -> IxSet ixs a
getLTE ix
v IxSet ixs a
ix
(@>=) :: (Indexable ixs a, IsIndexOf ix ixs)
=> IxSet ixs a -> ix -> IxSet ixs a
ix :: IxSet ixs a
ix @>= :: IxSet ixs a -> ix -> IxSet ixs a
@>= v :: ix
v = ix -> IxSet ixs a -> IxSet ixs a
forall (ixs :: [*]) a ix.
(Indexable ixs a, IsIndexOf ix ixs) =>
ix -> IxSet ixs a -> IxSet ixs a
getGTE ix
v IxSet ixs a
ix
(@><) :: (Indexable ixs a, IsIndexOf ix ixs)
=> IxSet ixs a -> (ix, ix) -> IxSet ixs a
ix :: IxSet ixs a
ix @>< :: IxSet ixs a -> (ix, ix) -> IxSet ixs a
@>< (v1 :: ix
v1,v2 :: ix
v2) = ix -> IxSet ixs a -> IxSet ixs a
forall (ixs :: [*]) a ix.
(Indexable ixs a, IsIndexOf ix ixs) =>
ix -> IxSet ixs a -> IxSet ixs a
getLT ix
v2 (IxSet ixs a -> IxSet ixs a) -> IxSet ixs a -> IxSet ixs a
forall a b. (a -> b) -> a -> b
$ ix -> IxSet ixs a -> IxSet ixs a
forall (ixs :: [*]) a ix.
(Indexable ixs a, IsIndexOf ix ixs) =>
ix -> IxSet ixs a -> IxSet ixs a
getGT ix
v1 IxSet ixs a
ix
(@>=<) :: (Indexable ixs a, IsIndexOf ix ixs)
=> IxSet ixs a -> (ix, ix) -> IxSet ixs a
ix :: IxSet ixs a
ix @>=< :: IxSet ixs a -> (ix, ix) -> IxSet ixs a
@>=< (v1 :: ix
v1,v2 :: ix
v2) = ix -> IxSet ixs a -> IxSet ixs a
forall (ixs :: [*]) a ix.
(Indexable ixs a, IsIndexOf ix ixs) =>
ix -> IxSet ixs a -> IxSet ixs a
getLT ix
v2 (IxSet ixs a -> IxSet ixs a) -> IxSet ixs a -> IxSet ixs a
forall a b. (a -> b) -> a -> b
$ ix -> IxSet ixs a -> IxSet ixs a
forall (ixs :: [*]) a ix.
(Indexable ixs a, IsIndexOf ix ixs) =>
ix -> IxSet ixs a -> IxSet ixs a
getGTE ix
v1 IxSet ixs a
ix
(@><=) :: (Indexable ixs a, IsIndexOf ix ixs)
=> IxSet ixs a -> (ix, ix) -> IxSet ixs a
ix :: IxSet ixs a
ix @><= :: IxSet ixs a -> (ix, ix) -> IxSet ixs a
@><= (v1 :: ix
v1,v2 :: ix
v2) = ix -> IxSet ixs a -> IxSet ixs a
forall (ixs :: [*]) a ix.
(Indexable ixs a, IsIndexOf ix ixs) =>
ix -> IxSet ixs a -> IxSet ixs a
getLTE ix
v2 (IxSet ixs a -> IxSet ixs a) -> IxSet ixs a -> IxSet ixs a
forall a b. (a -> b) -> a -> b
$ ix -> IxSet ixs a -> IxSet ixs a
forall (ixs :: [*]) a ix.
(Indexable ixs a, IsIndexOf ix ixs) =>
ix -> IxSet ixs a -> IxSet ixs a
getGT ix
v1 IxSet ixs a
ix
(@>=<=) :: (Indexable ixs a, IsIndexOf ix ixs)
=> IxSet ixs a -> (ix, ix) -> IxSet ixs a
ix :: IxSet ixs a
ix @>=<= :: IxSet ixs a -> (ix, ix) -> IxSet ixs a
@>=<= (v1 :: ix
v1,v2 :: ix
v2) = ix -> IxSet ixs a -> IxSet ixs a
forall (ixs :: [*]) a ix.
(Indexable ixs a, IsIndexOf ix ixs) =>
ix -> IxSet ixs a -> IxSet ixs a
getLTE ix
v2 (IxSet ixs a -> IxSet ixs a) -> IxSet ixs a -> IxSet ixs a
forall a b. (a -> b) -> a -> b
$ ix -> IxSet ixs a -> IxSet ixs a
forall (ixs :: [*]) a ix.
(Indexable ixs a, IsIndexOf ix ixs) =>
ix -> IxSet ixs a -> IxSet ixs a
getGTE ix
v1 IxSet ixs a
ix
(@+) :: (Indexable ixs a, IsIndexOf ix ixs)
=> IxSet ixs a -> [ix] -> IxSet ixs a
ix :: IxSet ixs a
ix @+ :: IxSet ixs a -> [ix] -> IxSet ixs a
@+ list :: [ix]
list = (IxSet ixs a -> IxSet ixs a -> IxSet ixs a)
-> IxSet ixs a -> [IxSet ixs a] -> IxSet ixs a
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
List.foldl' IxSet ixs a -> IxSet ixs a -> IxSet ixs a
forall (ixs :: [*]) a.
Indexable ixs a =>
IxSet ixs a -> IxSet ixs a -> IxSet ixs a
union IxSet ixs a
forall (ixs :: [*]) a. Indexable ixs a => IxSet ixs a
empty ([IxSet ixs a] -> IxSet ixs a) -> [IxSet ixs a] -> IxSet ixs a
forall a b. (a -> b) -> a -> b
$ (ix -> IxSet ixs a) -> [ix] -> [IxSet ixs a]
forall a b. (a -> b) -> [a] -> [b]
map (IxSet ixs a
ix IxSet ixs a -> ix -> IxSet ixs a
forall (ixs :: [*]) a ix.
(Indexable ixs a, IsIndexOf ix ixs) =>
IxSet ixs a -> ix -> IxSet ixs a
@=) [ix]
list
(@*) :: (Indexable ixs a, IsIndexOf ix ixs)
=> IxSet ixs a -> [ix] -> IxSet ixs a
ix :: IxSet ixs a
ix @* :: IxSet ixs a -> [ix] -> IxSet ixs a
@* list :: [ix]
list = (IxSet ixs a -> IxSet ixs a -> IxSet ixs a)
-> IxSet ixs a -> [IxSet ixs a] -> IxSet ixs a
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
List.foldl' IxSet ixs a -> IxSet ixs a -> IxSet ixs a
forall (ixs :: [*]) a.
Indexable ixs a =>
IxSet ixs a -> IxSet ixs a -> IxSet ixs a
intersection IxSet ixs a
ix ([IxSet ixs a] -> IxSet ixs a) -> [IxSet ixs a] -> IxSet ixs a
forall a b. (a -> b) -> a -> b
$ (ix -> IxSet ixs a) -> [ix] -> [IxSet ixs a]
forall a b. (a -> b) -> [a] -> [b]
map (IxSet ixs a
ix IxSet ixs a -> ix -> IxSet ixs a
forall (ixs :: [*]) a ix.
(Indexable ixs a, IsIndexOf ix ixs) =>
IxSet ixs a -> ix -> IxSet ixs a
@=) [ix]
list
getEQ :: (Indexable ixs a, IsIndexOf ix ixs)
=> ix -> IxSet ixs a -> IxSet ixs a
getEQ :: ix -> IxSet ixs a -> IxSet ixs a
getEQ = Ordering -> ix -> IxSet ixs a -> IxSet ixs a
forall (ixs :: [*]) a ix.
(Indexable ixs a, IsIndexOf ix ixs) =>
Ordering -> ix -> IxSet ixs a -> IxSet ixs a
getOrd Ordering
EQ
getLT :: (Indexable ixs a, IsIndexOf ix ixs)
=> ix -> IxSet ixs a -> IxSet ixs a
getLT :: ix -> IxSet ixs a -> IxSet ixs a
getLT = Ordering -> ix -> IxSet ixs a -> IxSet ixs a
forall (ixs :: [*]) a ix.
(Indexable ixs a, IsIndexOf ix ixs) =>
Ordering -> ix -> IxSet ixs a -> IxSet ixs a
getOrd Ordering
LT
getGT :: (Indexable ixs a, IsIndexOf ix ixs)
=> ix -> IxSet ixs a -> IxSet ixs a
getGT :: ix -> IxSet ixs a -> IxSet ixs a
getGT = Ordering -> ix -> IxSet ixs a -> IxSet ixs a
forall (ixs :: [*]) a ix.
(Indexable ixs a, IsIndexOf ix ixs) =>
Ordering -> ix -> IxSet ixs a -> IxSet ixs a
getOrd Ordering
GT
getLTE :: (Indexable ixs a, IsIndexOf ix ixs)
=> ix -> IxSet ixs a -> IxSet ixs a
getLTE :: ix -> IxSet ixs a -> IxSet ixs a
getLTE = Bool -> Bool -> Bool -> ix -> IxSet ixs a -> IxSet ixs a
forall (ixs :: [*]) ix a.
(Indexable ixs a, IsIndexOf ix ixs) =>
Bool -> Bool -> Bool -> ix -> IxSet ixs a -> IxSet ixs a
getOrd2 Bool
True Bool
True Bool
False
getGTE :: (Indexable ixs a, IsIndexOf ix ixs)
=> ix -> IxSet ixs a -> IxSet ixs a
getGTE :: ix -> IxSet ixs a -> IxSet ixs a
getGTE = Bool -> Bool -> Bool -> ix -> IxSet ixs a -> IxSet ixs a
forall (ixs :: [*]) ix a.
(Indexable ixs a, IsIndexOf ix ixs) =>
Bool -> Bool -> Bool -> ix -> IxSet ixs a -> IxSet ixs a
getOrd2 Bool
False Bool
True Bool
True
getRange :: (Indexable ixs a, IsIndexOf ix ixs)
=> ix -> ix -> IxSet ixs a -> IxSet ixs a
getRange :: ix -> ix -> IxSet ixs a -> IxSet ixs a
getRange k1 :: ix
k1 k2 :: ix
k2 ixset :: IxSet ixs a
ixset = ix -> IxSet ixs a -> IxSet ixs a
forall (ixs :: [*]) a ix.
(Indexable ixs a, IsIndexOf ix ixs) =>
ix -> IxSet ixs a -> IxSet ixs a
getGTE ix
k1 (ix -> IxSet ixs a -> IxSet ixs a
forall (ixs :: [*]) a ix.
(Indexable ixs a, IsIndexOf ix ixs) =>
ix -> IxSet ixs a -> IxSet ixs a
getLT ix
k2 IxSet ixs a
ixset)
groupBy :: forall ix ixs a. IsIndexOf ix ixs => IxSet ixs a -> [(ix, [a])]
groupBy :: IxSet ixs a -> [(ix, [a])]
groupBy (IxSet _ indexes :: IxList ixs a
indexes) = Ix ix a -> [(ix, [a])]
f (IxList ixs a -> Ix ix a
forall ix (ixs :: [*]) a.
IsIndexOf ix ixs =>
IxList ixs a -> Ix ix a
access IxList ixs a
indexes)
where
f :: Ix ix a -> [(ix, [a])]
f :: Ix ix a -> [(ix, [a])]
f (Ix index :: Map ix (Set a)
index _) = ((ix, Set a) -> (ix, [a])) -> [(ix, Set a)] -> [(ix, [a])]
forall a b. (a -> b) -> [a] -> [b]
map ((Set a -> [a]) -> (ix, Set a) -> (ix, [a])
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (d, b) (d, c)
second Set a -> [a]
forall a. Set a -> [a]
Set.toList) (Map ix (Set a) -> [(ix, Set a)]
forall k a. Map k a -> [(k, a)]
Map.toList Map ix (Set a)
index)
indexKeys :: forall ix ixs a . IsIndexOf ix ixs => IxSet ixs a -> [ix]
indexKeys :: IxSet ixs a -> [ix]
indexKeys (IxSet _ indexes :: IxList ixs a
indexes) = Ix ix a -> [ix]
f (IxList ixs a -> Ix ix a
forall ix (ixs :: [*]) a.
IsIndexOf ix ixs =>
IxList ixs a -> Ix ix a
access IxList ixs a
indexes)
where
f :: Ix ix a -> [ix]
f :: Ix ix a -> [ix]
f (Ix index :: Map ix (Set a)
index _) = Map ix (Set a) -> [ix]
forall k a. Map k a -> [k]
Map.keys Map ix (Set a)
index
groupAscBy :: forall ix ixs a. IsIndexOf ix ixs => IxSet ixs a -> [(ix, [a])]
groupAscBy :: IxSet ixs a -> [(ix, [a])]
groupAscBy (IxSet _ indexes :: IxList ixs a
indexes) = Ix ix a -> [(ix, [a])]
f (IxList ixs a -> Ix ix a
forall ix (ixs :: [*]) a.
IsIndexOf ix ixs =>
IxList ixs a -> Ix ix a
access IxList ixs a
indexes)
where
f :: Ix ix a -> [(ix, [a])]
f :: Ix ix a -> [(ix, [a])]
f (Ix index :: Map ix (Set a)
index _) = ((ix, Set a) -> (ix, [a])) -> [(ix, Set a)] -> [(ix, [a])]
forall a b. (a -> b) -> [a] -> [b]
map ((Set a -> [a]) -> (ix, Set a) -> (ix, [a])
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (d, b) (d, c)
second Set a -> [a]
forall a. Set a -> [a]
Set.toAscList) (Map ix (Set a) -> [(ix, Set a)]
forall k a. Map k a -> [(k, a)]
Map.toAscList Map ix (Set a)
index)
groupDescBy :: IsIndexOf ix ixs => IxSet ixs a -> [(ix, [a])]
groupDescBy :: IxSet ixs a -> [(ix, [a])]
groupDescBy (IxSet _ indexes :: IxList ixs a
indexes) = Ix ix a -> [(ix, [a])]
forall ix a. Ix ix a -> [(ix, [a])]
f (IxList ixs a -> Ix ix a
forall ix (ixs :: [*]) a.
IsIndexOf ix ixs =>
IxList ixs a -> Ix ix a
access IxList ixs a
indexes)
where
f :: Ix ix a -> [(ix, [a])]
f :: Ix ix a -> [(ix, [a])]
f (Ix index :: Map ix (Set a)
index _) = ((ix, Set a) -> (ix, [a])) -> [(ix, Set a)] -> [(ix, [a])]
forall a b. (a -> b) -> [a] -> [b]
map ((Set a -> [a]) -> (ix, Set a) -> (ix, [a])
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (d, b) (d, c)
second Set a -> [a]
forall a. Set a -> [a]
Set.toAscList) (Map ix (Set a) -> [(ix, Set a)]
forall k a. Map k a -> [(k, a)]
Map.toDescList Map ix (Set a)
index)
getOrd :: (Indexable ixs a, IsIndexOf ix ixs)
=> Ordering -> ix -> IxSet ixs a -> IxSet ixs a
getOrd :: Ordering -> ix -> IxSet ixs a -> IxSet ixs a
getOrd LT = Bool -> Bool -> Bool -> ix -> IxSet ixs a -> IxSet ixs a
forall (ixs :: [*]) ix a.
(Indexable ixs a, IsIndexOf ix ixs) =>
Bool -> Bool -> Bool -> ix -> IxSet ixs a -> IxSet ixs a
getOrd2 Bool
True Bool
False Bool
False
getOrd EQ = Bool -> Bool -> Bool -> ix -> IxSet ixs a -> IxSet ixs a
forall (ixs :: [*]) ix a.
(Indexable ixs a, IsIndexOf ix ixs) =>
Bool -> Bool -> Bool -> ix -> IxSet ixs a -> IxSet ixs a
getOrd2 Bool
False Bool
True Bool
False
getOrd GT = Bool -> Bool -> Bool -> ix -> IxSet ixs a -> IxSet ixs a
forall (ixs :: [*]) ix a.
(Indexable ixs a, IsIndexOf ix ixs) =>
Bool -> Bool -> Bool -> ix -> IxSet ixs a -> IxSet ixs a
getOrd2 Bool
False Bool
False Bool
True
getOrd2 :: forall ixs ix a. (Indexable ixs a, IsIndexOf ix ixs)
=> Bool -> Bool -> Bool -> ix -> IxSet ixs a -> IxSet ixs a
getOrd2 :: Bool -> Bool -> Bool -> ix -> IxSet ixs a -> IxSet ixs a
getOrd2 inclt :: Bool
inclt inceq :: Bool
inceq incgt :: Bool
incgt v :: ix
v (IxSet _ ixs :: IxList ixs a
ixs) = Ix ix a -> IxSet ixs a
f (IxList ixs a -> Ix ix a
forall ix (ixs :: [*]) a.
IsIndexOf ix ixs =>
IxList ixs a -> Ix ix a
access IxList ixs a
ixs)
where
f :: Ix ix a -> IxSet ixs a
f :: Ix ix a -> IxSet ixs a
f (Ix index :: Map ix (Set a)
index _) = Map ix (Set a) -> IxSet ixs a
forall (ixs :: [*]) ix a.
(Indexable ixs a, IsIndexOf ix ixs) =>
Map ix (Set a) -> IxSet ixs a
fromMapOfSets Map ix (Set a)
result
where
lt', gt' :: Map ix (Set a)
eq' :: Maybe (Set a)
(lt' :: Map ix (Set a)
lt', eq' :: Maybe (Set a)
eq', gt' :: Map ix (Set a)
gt') = ix
-> Map ix (Set a)
-> (Map ix (Set a), Maybe (Set a), Map ix (Set a))
forall k a. Ord k => k -> Map k a -> (Map k a, Maybe a, Map k a)
Map.splitLookup ix
v Map ix (Set a)
index
lt, gt :: Map ix (Set a)
lt :: Map ix (Set a)
lt = if Bool
inclt then Map ix (Set a)
lt' else Map ix (Set a)
forall k a. Map k a
Map.empty
gt :: Map ix (Set a)
gt = if Bool
incgt then Map ix (Set a)
gt' else Map ix (Set a)
forall k a. Map k a
Map.empty
eq :: Maybe (Set a)
eq :: Maybe (Set a)
eq = if Bool
inceq then Maybe (Set a)
eq' else Maybe (Set a)
forall a. Maybe a
Nothing
ltgt :: Map ix (Set a)
ltgt :: Map ix (Set a)
ltgt = (Set a -> Set a -> Set a)
-> Map ix (Set a) -> Map ix (Set a) -> Map ix (Set a)
forall k a. Ord k => (a -> a -> a) -> Map k a -> Map k a -> Map k a
Map.unionWith Set a -> Set a -> Set a
forall a. Ord a => Set a -> Set a -> Set a
Set.union Map ix (Set a)
lt Map ix (Set a)
gt
result :: Map ix (Set a)
result :: Map ix (Set a)
result = case Maybe (Set a)
eq of
Just eqset :: Set a
eqset -> (Set a -> Set a -> Set a)
-> ix -> Set a -> Map ix (Set a) -> Map ix (Set a)
forall k a. Ord k => (a -> a -> a) -> k -> a -> Map k a -> Map k a
Map.insertWith Set a -> Set a -> Set a
forall a. Ord a => Set a -> Set a -> Set a
Set.union ix
v Set a
eqset Map ix (Set a)
ltgt
Nothing -> Map ix (Set a)
ltgt
stats :: Indexable ixs a => IxSet ixs a -> (Int,Int,Int,Int)
stats :: IxSet ixs a -> (Int, Int, Int, Int)
stats (IxSet a :: Set a
a ixs :: IxList ixs a
ixs) = (Int
no_elements,Int
no_indexes,Int
no_keys,Int
no_values)
where
no_elements :: Int
no_elements = Set a -> Int
forall a. Set a -> Int
Set.size Set a
a
no_indexes :: Int
no_indexes = IxList ixs a -> Int
forall (ixs :: [*]) a. IxList ixs a -> Int
lengthIxList IxList ixs a
ixs
no_keys :: Int
no_keys = [Int] -> Int
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum ((forall ix. Ord ix => Ix ix a -> Int) -> IxList ixs a -> [Int]
forall (ixs :: [*]) a r.
All Ord ixs =>
(forall ix. Ord ix => Ix ix a -> r) -> IxList ixs a -> [r]
ixListToList (\ (Ix m :: Map ix (Set a)
m _) -> Map ix (Set a) -> Int
forall k a. Map k a -> Int
Map.size Map ix (Set a)
m) IxList ixs a
ixs)
no_values :: Int
no_values = [Int] -> Int
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum ((forall ix. Ord ix => Ix ix a -> Int) -> IxList ixs a -> [Int]
forall (ixs :: [*]) a r.
All Ord ixs =>
(forall ix. Ord ix => Ix ix a -> r) -> IxList ixs a -> [r]
ixListToList (\ (Ix m :: Map ix (Set a)
m _) -> [Int] -> Int
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum [Set a -> Int
forall a. Set a -> Int
Set.size Set a
s | Set a
s <- Map ix (Set a) -> [Set a]
forall k a. Map k a -> [a]
Map.elems Map ix (Set a)
m]) IxList ixs a
ixs)