set-algebra-0.1.0.0: Set Algebra
Safe Haskell None
Language Haskell2010

Control.SetAlgebra

Synopsis

Documentation

data List k v Source #

Instances

Instances details
Basic List Source #

The constructor for List is hidden, since it requires some invariants. Use fromPairs to build an initial List.

Instance details

Defined in Control.Iterate.BaseTypes

Iter List Source #
Instance details

Defined in Control.Iterate.BaseTypes

Ord k => Embed [(k, v)] ( List k v) Source #
Instance details

Defined in Control.Iterate.BaseTypes

Methods

toBase :: [(k, v)] -> List k v Source #

fromBase :: List k v -> [(k, v)] Source #

Ord k => HasExp [(k, v)] ( List k v) Source #
Instance details

Defined in Control.Iterate.Exp

Methods

toExp :: [(k, v)] -> Exp ( List k v) Source #

( Eq k, Eq v) => Eq ( List k v) Source #
Instance details

Defined in Control.Iterate.BaseTypes

( Show k, Show v) => Show ( List k v) Source #
Instance details

Defined in Control.Iterate.BaseTypes

data BiMap v a b Source #

Instances

Instances details
Ord v => Basic ( BiMap v) Source #
Instance details

Defined in Control.Iterate.BaseTypes

Methods

addpair :: Ord k => k -> v0 -> BiMap v k v0 -> BiMap v k v0 Source #

addkv :: Ord k => (k, v0) -> BiMap v k v0 -> (v0 -> v0 -> v0) -> BiMap v k v0 Source #

removekey :: Ord k => k -> BiMap v k v0 -> BiMap v k v0 Source #

domain :: Ord k => BiMap v k v0 -> Set k Source #

range :: Ord v0 => BiMap v k v0 -> Set v0 Source #

Ord v => Iter ( BiMap v) Source #
Instance details

Defined in Control.Iterate.BaseTypes

( Ord k, Ord v) => HasExp ( Bimap k v) ( Bimap k v) Source #
Instance details

Defined in Control.Iterate.Exp

( Eq k, Eq v) => Eq ( BiMap u k v)
Instance details

Defined in Data.BiMap

( Show k, Show v) => Show ( BiMap u k v)
Instance details

Defined in Data.BiMap

( Ord a, Ord b, ToCBOR a, ToCBOR b) => ToCBOR ( BiMap b a b)
Instance details

Defined in Data.BiMap

( Ord a, Ord b, FromCBOR a, FromCBOR b) => FromCBOR ( BiMap b a b)
Instance details

Defined in Data.BiMap

NFData ( BiMap v a b)
Instance details

Defined in Data.BiMap

Methods

rnf :: BiMap v a b -> () Source #

( NoThunks a, NoThunks b) => NoThunks ( BiMap v a b)
Instance details

Defined in Data.BiMap

( Ord v, Ord k) => HasQuery ( BiMap v k v) k v Source #
Instance details

Defined in Control.Iterate.Exp

Embed ( BiMap v k v) ( BiMap v k v) Source #
Instance details

Defined in Control.Iterate.BaseTypes

data Single k v where Source #

Constructors

Single :: k -> v -> Single k v
Fail :: Single k v
SetSingle :: k -> Single k ()

Instances

Instances details
Basic Single Source #
Instance details

Defined in Control.Iterate.BaseTypes

Iter Single Source #
Instance details

Defined in Control.Iterate.BaseTypes

( Eq k, Eq v) => Eq ( Single k v) Source #
Instance details

Defined in Control.Iterate.BaseTypes

( Show k, Show v) => Show ( Single k v) Source #
Instance details

Defined in Control.Iterate.BaseTypes

Ord k => HasQuery ( Single k v) k v Source #
Instance details

Defined in Control.Iterate.Exp

Embed ( Single k v) ( Single k v) Source #
Instance details

Defined in Control.Iterate.BaseTypes

Ord k => HasExp ( Single k v) ( Single k v) Source #
Instance details

Defined in Control.Iterate.Exp

class Basic f where Source #

In order to build typed Exp (which are a typed deep embedding) of Set operations, we need to know what kind of basic types of Maps and Sets can be used this way. Every Basic type has a few operations for creating one from a list, for adding and removing key-value pairs, looking up a value given a key. Instances of this algebra are functional in that every key has exactly one value associated with it.

Minimal complete definition

addkv , removekey , domain , range

Methods

addpair :: Ord k => k -> v -> f k v -> f k v Source #

in addpair the new value always prevails, to make a choice use addkv which has a combining function that allows choice.

addkv :: Ord k => (k, v) -> f k v -> (v -> v -> v) -> f k v Source #

use ( old new -> old) if you want the v in (f k v) to prevail, and use ( old new -> new) if you want the v in (k,v) to prevail

removekey :: Ord k => k -> f k v -> f k v Source #

domain :: Ord k => f k v -> Set k Source #

range :: Ord v => f k v -> Set v Source #

Instances

Instances details
Basic Map Source #
Instance details

Defined in Control.Iterate.BaseTypes

Basic Sett Source #
Instance details

Defined in Control.Iterate.BaseTypes

Basic Single Source #
Instance details

Defined in Control.Iterate.BaseTypes

Basic List Source #

The constructor for List is hidden, since it requires some invariants. Use fromPairs to build an initial List.

Instance details

Defined in Control.Iterate.BaseTypes

Ord v => Basic ( BiMap v) Source #
Instance details

Defined in Control.Iterate.BaseTypes

Methods

addpair :: Ord k => k -> v0 -> BiMap v k v0 -> BiMap v k v0 Source #

addkv :: Ord k => (k, v0) -> BiMap v k v0 -> (v0 -> v0 -> v0) -> BiMap v k v0 Source #

removekey :: Ord k => k -> BiMap v k v0 -> BiMap v k v0 Source #

domain :: Ord k => BiMap v k v0 -> Set k Source #

range :: Ord v0 => BiMap v k v0 -> Set v0 Source #

( Monoid coin, Ord coin, Ord cred, Ord ptr, Ord pool) => Basic ( View coin cred pool ptr) Source #
Instance details

Defined in Control.Iterate.BaseTypes

Methods

addpair :: Ord k => k -> v -> View coin cred pool ptr k v -> View coin cred pool ptr k v Source #

addkv :: Ord k => (k, v) -> View coin cred pool ptr k v -> (v -> v -> v) -> View coin cred pool ptr k v Source #

removekey :: Ord k => k -> View coin cred pool ptr k v -> View coin cred pool ptr k v Source #

domain :: Ord k => View coin cred pool ptr k v -> Set k Source #

range :: Ord v => View coin cred pool ptr k v -> Set v Source #

class Iter f where Source #

Minimal complete definition

nxt , lub

Methods

nxt :: f a b -> Collect (a, b, f a b) Source #

lub :: Ord k => k -> f k b -> Collect (k, b, f k b) Source #

hasNxt :: f a b -> Maybe (a, b, f a b) Source #

hasLub :: Ord k => k -> f k b -> Maybe (k, b, f k b) Source #

haskey :: Ord key => key -> f key b -> Bool Source #

isnull :: f k v -> Bool Source #

lookup :: Ord key => key -> f key rng -> Maybe rng Source #

element :: Ord k => k -> f k v -> Collect () Source #

Instances

Instances details
Iter Map Source #
Instance details

Defined in Control.Iterate.BaseTypes

Iter Sett Source #
Instance details

Defined in Control.Iterate.BaseTypes

Iter Single Source #
Instance details

Defined in Control.Iterate.BaseTypes

Iter List Source #
Instance details

Defined in Control.Iterate.BaseTypes

Iter Query Source #
Instance details

Defined in Control.Iterate.Exp

Ord v => Iter ( BiMap v) Source #
Instance details

Defined in Control.Iterate.BaseTypes

( Ord coin, Ord cred, Ord ptr) => Iter ( View coin cred pool ptr) Source #
Instance details

Defined in Control.Iterate.BaseTypes

Methods

nxt :: View coin cred pool ptr a b -> Collect (a, b, View coin cred pool ptr a b) Source #

lub :: Ord k => k -> View coin cred pool ptr k b -> Collect (k, b, View coin cred pool ptr k b) Source #

hasNxt :: View coin cred pool ptr a b -> Maybe (a, b, View coin cred pool ptr a b) Source #

hasLub :: Ord k => k -> View coin cred pool ptr k b -> Maybe (k, b, View coin cred pool ptr k b) Source #

haskey :: Ord key => key -> View coin cred pool ptr key b -> Bool Source #

isnull :: View coin cred pool ptr k v -> Bool Source #

lookup :: Ord key => key -> View coin cred pool ptr key rng -> Maybe rng Source #

element :: Ord k => k -> View coin cred pool ptr k v -> Collect () Source #

class Embed concrete base | concrete -> base where Source #

Methods

toBase :: concrete -> base Source #

fromBase :: base -> concrete Source #

Instances

Instances details
Embed Bool Bool Source #
Instance details

Defined in Control.Iterate.BaseTypes

Ord k => Embed [(k, v)] ( List k v) Source #
Instance details

Defined in Control.Iterate.BaseTypes

Methods

toBase :: [(k, v)] -> List k v Source #

fromBase :: List k v -> [(k, v)] Source #

Embed ( Set k) ( Sett k ()) Source #
Instance details

Defined in Control.Iterate.BaseTypes

Embed ( Map k v) ( Map k v) Source #
Instance details

Defined in Control.Iterate.BaseTypes

Embed ( Single k v) ( Single k v) Source #
Instance details

Defined in Control.Iterate.BaseTypes

Embed ( BiMap v k v) ( BiMap v k v) Source #
Instance details

Defined in Control.Iterate.BaseTypes

Embed ( View coin cred pool ptr k v) ( View coin cred pool ptr k v) Source #
Instance details

Defined in Control.Iterate.BaseTypes

Methods

toBase :: View coin cred pool ptr k v -> View coin cred pool ptr k v Source #

fromBase :: View coin cred pool ptr k v -> View coin cred pool ptr k v Source #

class HasExp s t | s -> t where Source #

Basic types are those that can be embedded into Exp. The HasExp class, encodes how to lift a Basic type into an Exp. The function toExp will build a typed Exp for that Basic type. This will be really usefull in the smart constructors.

Instances

Instances details
HasExp ( Exp t) t Source #

The simplest Base type is one that is already an Exp

Instance details

Defined in Control.Iterate.Exp

Ord k => HasExp [(k, v)] ( List k v) Source #
Instance details

Defined in Control.Iterate.Exp

Methods

toExp :: [(k, v)] -> Exp ( List k v) Source #

Ord k => HasExp ( Set k) ( Sett k ()) Source #
Instance details

Defined in Control.Iterate.Exp

Ord k => HasExp ( Map k v) ( Map k v) Source #
Instance details

Defined in Control.Iterate.Exp

( Ord k, Ord v) => HasExp ( Bimap k v) ( Bimap k v) Source #
Instance details

Defined in Control.Iterate.Exp

Ord k => HasExp ( Single k v) ( Single k v) Source #
Instance details

Defined in Control.Iterate.Exp

( UnifiedView coin cred pool ptr k v, Ord k, Monoid coin, Ord coin, Ord cred, Ord ptr, Ord pool) => HasExp ( View coin cred pool ptr k v) ( View coin cred pool ptr k v) Source #
Instance details

Defined in Control.Iterate.Exp

Methods

toExp :: View coin cred pool ptr k v -> Exp ( View coin cred pool ptr k v) Source #

data BaseRep f k v where Source #

BaseRep witnesses Basic types. I.e. those types that are instances of both Basic and Iter. Pattern matching against a constructor of type BaseRep, determines which base type. For example data Tag f k v = Tag (BaseRep f k v) (f k v) case Tag MapR x -> -- here we know x :: Map.Map k v

dom :: ( Ord k, HasExp s (f k v)) => s -> Exp ( Sett k ()) Source #

rng :: ( Ord k, Ord v) => HasExp s (f k v) => s -> Exp ( Sett v ()) Source #

dexclude :: ( Ord k, Iter g, HasExp s1 (g k ()), HasExp s2 (f k v)) => s1 -> s2 -> Exp (f k v) Source #

drestrict :: ( Ord k, HasExp s1 ( Sett k ()), HasExp s2 (f k v)) => s1 -> s2 -> Exp (f k v) Source #

rexclude :: ( Ord k, Iter g, Ord v, HasExp s1 (f k v), HasExp s2 (g v ())) => s1 -> s2 -> Exp (f k v) Source #

rrestrict :: ( Ord k, Iter g, Ord v, HasExp s1 (f k v), HasExp s2 (g v ())) => s1 -> s2 -> Exp (f k v) Source #

unionleft :: ( Show k, Show v, Ord k, HasExp s1 (f k v), HasExp s2 (g k v)) => s1 -> s2 -> Exp (f k v) Source #

unionright :: ( Ord k, HasExp s1 (f k v), HasExp s2 (g k v)) => s1 -> s2 -> Exp (f k v) Source #

unionplus :: ( Ord k, Monoid n, HasExp s1 (f k n), HasExp s2 (g k n)) => s1 -> s2 -> Exp (f k n) Source #

intersect :: ( Ord k, Iter f, Iter g, HasExp s1 (f k v), HasExp s2 (g k u)) => s1 -> s2 -> Exp ( Sett k ()) Source #

subset :: ( Ord k, Iter f, Iter g, HasExp s1 (f k v), HasExp s2 (g k u)) => s1 -> s2 -> Exp Bool Source #

keyeq :: ( Ord k, Iter f, Iter g, HasExp s1 (f k v), HasExp s2 (g k u)) => s1 -> s2 -> Exp Bool Source #

(◁) :: ( Ord k, HasExp s1 ( Sett k ()), HasExp s2 (f k v)) => s1 -> s2 -> Exp (f k v) Source #

(⋪) :: ( Ord k, Iter g, HasExp s1 (g k ()), HasExp s2 (f k v)) => s1 -> s2 -> Exp (f k v) Source #

(▷) :: ( Ord k, Iter g, Ord v, HasExp s1 (f k v), HasExp s2 (g v ())) => s1 -> s2 -> Exp (f k v) Source #

(⋫) :: ( Ord k, Iter g, Ord v, HasExp s1 (f k v), HasExp s2 (g v ())) => s1 -> s2 -> Exp (f k v) Source #

(∪) :: ( Show k, Show v, Ord k, HasExp s1 (f k v), HasExp s2 (g k v)) => s1 -> s2 -> Exp (f k v) Source #

(⨃) :: ( Ord k, HasExp s1 (f k v), HasExp s2 (g k v)) => s1 -> s2 -> Exp (f k v) Source #

(∪+) :: ( Ord k, Monoid n, HasExp s1 (f k n), HasExp s2 (g k n)) => s1 -> s2 -> Exp (f k n) Source #

(∩) :: ( Ord k, Iter f, Iter g, HasExp s1 (f k v), HasExp s2 (g k u)) => s1 -> s2 -> Exp ( Sett k ()) Source #

(⊆) :: ( Ord k, Iter f, Iter g, HasExp s1 (f k v), HasExp s2 (g k u)) => s1 -> s2 -> Exp Bool Source #

(≍) :: ( Ord k, Iter f, Iter g, HasExp s1 (f k v), HasExp s2 (g k u)) => s1 -> s2 -> Exp Bool Source #

(<|) :: ( Ord k, HasExp s1 ( Sett k ()), HasExp s2 (f k v)) => s1 -> s2 -> Exp (f k v) Source #

(|>) :: ( Ord k, Iter g, Ord v, HasExp s1 (f k v), HasExp s2 (g v ())) => s1 -> s2 -> Exp (f k v) Source #

(➖) :: ( Ord k, Iter f, Iter g, HasExp s1 (f k v), HasExp s2 (g k u)) => s1 -> s2 -> Exp (f k v) Source #

data Exp t where Source #

The self typed GADT: Exp, that encodes the shape of Set expressions. A deep embedding. Exp is a typed Symbolic representation of queries we may ask. It allows us to introspect a query The strategy is to 1) Define Exp so all queries can be represented. 2) Define smart constructors that "parse" the surface syntax, and build a typed Exp 3) Write an evaluate function: eval:: Exp t -> t 4) "eval" can introspect the code and apply efficient domain and type specific translations 5) Use the (Iter f) class to evaluate some Exp that can benefit from its efficient nature.

Constructors

Base :: ( Ord k, Basic f, Iter f) => BaseRep f k v -> f k v -> Exp (f k v)

Instances

Instances details
Show ( Exp t) Source #
Instance details

Defined in Control.Iterate.Exp

HasExp ( Exp t) t Source #

The simplest Base type is one that is already an Exp

Instance details

Defined in Control.Iterate.Exp

materialize :: Ord k => BaseRep f k v -> Collect (k, v) -> f k v Source #

A witness (BaseRep) can be used to materialize a (Collect k v) into the type witnessed by the BaseRep. Recall a (Collect k v) has no intrinsic type (it is just an ABSTRACT sequence of tuples), so the witness describes how to turn them into the chosen datatype. Note that materialize is meant to be applied to a collection built by iterating over a Query. This produces the keys in ascending order, with no duplicate keys. So we do not need to specify how to merge duplicate values.

biMapFromList :: ( Ord k, Ord v) => (v -> v -> v) -> [(k, v)] -> BiMap v k v Source #

fromList :: Ord k => BaseRep f k v -> (v -> v -> v) -> [(k, v)] -> f k v Source #