Copyright | (c) gspia 2020- |
---|---|
License | BSD |
Maintainer | gspia |
Safe Haskell | Safe |
Language | Haskell2010 |
Fcf.Data.MapC
MapC provides an interface to mapping keys to values, which is similar to that given by the containers-package. Note that the this module still misses some of the methods that can be found in containers. If you need some, please do open up an issue or better, make a PR.
Many of the examples are from containers-package.
We call this MapC because name Map is reserved to the map-function in Fcf-package. The internal representation is type-level list. We hope that one day the internal representation is based on balanced trees similar to the one used in the containers.
Synopsis
- data MapC k v = MapC [(k, v)]
- data Empty :: Exp (MapC k v)
- data Singleton :: k -> v -> Exp (MapC k v)
- data FromList :: [(k, v)] -> Exp (MapC k v)
- data Insert :: k -> v -> MapC k v -> Exp (MapC k v)
- data InsertWith :: (v -> v -> Exp v) -> k -> v -> MapC k v -> Exp (MapC k v)
- data InsWithHelp :: (v -> v -> Exp v) -> k -> v -> (k, v) -> Exp (k, v)
- data Delete :: k -> MapC k v -> Exp (MapC k v)
- data Adjust :: (v -> Exp v) -> k -> MapC k v -> Exp (MapC k v)
- data AdjustHelp :: (v -> Exp v) -> k -> [(k, v)] -> Exp [(k, v)]
- data Lookup :: k -> MapC k v -> Exp (Maybe v)
- data Member :: k -> MapC k v -> Exp Bool
- data NotMember :: k -> MapC k v -> Exp Bool
- data Null :: MapC k v -> Exp Bool
- data Size :: MapC k v -> Exp Nat
- data Union :: MapC k v -> MapC k v -> Exp (MapC k v)
- data UComb :: (k, v) -> [(k, v)] -> Exp [(k, v)]
- data Difference :: MapC k v -> MapC k v -> Exp (MapC k v)
- data DiffNotMem :: MapC k v -> k -> v -> Exp Bool
- data Intersection :: MapC k v -> MapC k v -> Exp (MapC k v)
- data InterMem :: MapC k v -> k -> v -> Exp Bool
- data Disjoint :: MapC k v -> MapC k v -> Exp Bool
- data Map :: (v -> Exp w) -> MapC k v -> Exp (MapC k w)
- data MapWithKey :: (k -> v -> Exp w) -> MapC k v -> Exp (MapC k w)
- data MWKhelp :: [(k, v)] -> Exp [(k, (k, v))]
- data Foldr :: (v -> w -> Exp w) -> w -> MapC k v -> Exp w
- data Elems :: MapC k v -> Exp [v]
- data Keys :: MapC k v -> Exp [k]
- data Assocs :: MapC k v -> Exp [(k, v)]
- data ToList :: MapC k v -> Exp [(k, v)]
- data Filter :: (v -> Exp Bool) -> MapC k v -> Exp (MapC k v)
- data FilterWithKey :: (k -> v -> Exp Bool) -> MapC k v -> Exp (MapC k v)
- data Partition :: (v -> Exp Bool) -> MapC k v -> Exp (MapC k v, MapC k v)
- data PartitionHlp :: ([(k, v)], [(k, v)]) -> Exp (MapC k v, MapC k v)
Documentation
>>>
import Fcf ( type (>=), Pure1, Pure2 )
>>>
import Fcf.Data.Nat
A type corresponding to Map in the containers. We call this MapC because name Map is reserved to the map-function in Fcf-package.
The representation is based on type-level lists. Please, do not use that fact but rather use the exposed API. (We hope to change the internal data type to balanced tree similar to the one used in containers. See TODO.md.)
MapC [(k, v)] |
Instances
type Eval (Empty :: MapC k v -> Type) Source # | |
type Eval (PartitionHlp ((,) xs ys) :: (MapC k v, MapC k v) -> Type) Source # | |
Defined in Fcf.Data.MapC | |
type Eval (FromList lst :: MapC k v -> Type) Source # | |
type Eval (Partition f (MapC lst) :: (MapC k v, MapC k v) -> Type) Source # | |
type Eval (Singleton k2 v2 :: MapC k1 v1 -> Type) Source # | |
type Eval (Delete k2 (MapC lst) :: MapC k1 v -> Type) Source # | |
type Eval (Union (MapC lst1) (MapC lst2) :: MapC k v -> Type) Source # | |
type Eval (Filter f (MapC lst) :: MapC k v -> Type) Source # | |
type Eval (FilterWithKey f (MapC lst) :: MapC k v -> Type) Source # | |
Defined in Fcf.Data.MapC | |
type Eval (Intersection mp1 mp2 :: MapC k v -> Type) Source # | |
Defined in Fcf.Data.MapC | |
type Eval (Difference mp1 mp2 :: MapC k v -> Type) Source # | |
Defined in Fcf.Data.MapC | |
type Eval (Insert k2 v2 (MapC lst) :: MapC k1 v1 -> Type) Source # | |
type Eval (Adjust f k2 (MapC lst) :: MapC k1 v -> Type) Source # | |
Defined in Fcf.Data.MapC | |
type Eval (MapWithKey f mp :: MapC k v2 -> Type) Source # | |
type Eval (Map f mp :: MapC k v2 -> Type) Source # | |
type Eval (InsertWith f k2 v2 (MapC lst) :: MapC k1 v1 -> Type) Source # | |
data Empty :: Exp (MapC k v) Source #
Empty
Example
>>>
:kind! (Eval Empty :: MapC Nat TL.Symbol)
(Eval Empty :: MapC Nat TL.Symbol) :: MapC Nat TL.Symbol = 'MapC '[]
>>>
:kind! (Eval Empty :: MapC Int String)
(Eval Empty :: MapC Int String) :: MapC Int [Char] = 'MapC '[]
See also the other examples in this module.
data Singleton :: k -> v -> Exp (MapC k v) Source #
Singleton
Example
>>>
:kind! Eval (Singleton 1 "haa")
Eval (Singleton 1 "haa") :: MapC Nat TL.Symbol = 'MapC '[ '(1, "haa")]
data FromList :: [(k, v)] -> Exp (MapC k v) Source #
Use FromList to construct a MapC from type-level list.
Example
>>>
:kind! Eval (FromList '[ '(1,"haa"), '(2,"hoo")])
Eval (FromList '[ '(1,"haa"), '(2,"hoo")]) :: MapC Nat TL.Symbol = 'MapC '[ '(1, "haa"), '(2, "hoo")]
data Insert :: k -> v -> MapC k v -> Exp (MapC k v) Source #
Insert
Example
>>>
:kind! Eval (Insert 3 "hih" =<< FromList '[ '(1,"haa"), '(2,"hoo")])
Eval (Insert 3 "hih" =<< FromList '[ '(1,"haa"), '(2,"hoo")]) :: MapC Nat TL.Symbol = 'MapC '[ '(3, "hih"), '(1, "haa"), '(2, "hoo")]
data InsertWith :: (v -> v -> Exp v) -> k -> v -> MapC k v -> Exp (MapC k v) Source #
InsertWith if old there, map if no old, add
Example
>>>
:kind! Eval (InsertWith (Pure2 TL.AppendSymbol) 5 "xxx" (Eval (FromList '[ '(5,"a"), '(3,"b")])))
Eval (InsertWith (Pure2 TL.AppendSymbol) 5 "xxx" (Eval (FromList '[ '(5,"a"), '(3,"b")]))) :: MapC Nat TL.Symbol = 'MapC '[ '(5, "xxxa"), '(3, "b")]
>>>
:kind! Eval (InsertWith (Pure2 TL.AppendSymbol) 7 "xxx" (Eval (FromList '[ '(5,"a"), '(3,"b")])))
Eval (InsertWith (Pure2 TL.AppendSymbol) 7 "xxx" (Eval (FromList '[ '(5,"a"), '(3,"b")]))) :: MapC Nat TL.Symbol = 'MapC '[ '(5, "a"), '(3, "b"), '(7, "xxx")]
>>>
:kind! Eval (InsertWith (Pure2 TL.AppendSymbol) 5 "xxx" =<< Empty)
Eval (InsertWith (Pure2 TL.AppendSymbol) 5 "xxx" =<< Empty) :: MapC Nat TL.Symbol = 'MapC '[ '(5, "xxx")]
data InsWithHelp :: (v -> v -> Exp v) -> k -> v -> (k, v) -> Exp (k, v) Source #
data Delete :: k -> MapC k v -> Exp (MapC k v) Source #
Delete
Example
>>>
:kind! Eval (Delete 5 (Eval (FromList '[ '(5,"a"), '(3,"b")])))
Eval (Delete 5 (Eval (FromList '[ '(5,"a"), '(3,"b")]))) :: MapC Nat TL.Symbol = 'MapC '[ '(3, "b")]
>>>
:kind! Eval (Delete 7 (Eval (FromList '[ '(5,"a"), '(3,"b")])))
Eval (Delete 7 (Eval (FromList '[ '(5,"a"), '(3,"b")]))) :: MapC Nat TL.Symbol = 'MapC '[ '(5, "a"), '(3, "b")]
>>>
:kind! Eval (Delete 7 (Eval Empty))
Eval (Delete 7 (Eval Empty)) :: MapC Nat v = 'MapC '[]
data Adjust :: (v -> Exp v) -> k -> MapC k v -> Exp (MapC k v) Source #
Adjust
Example
>>>
:kind! Eval (Adjust (Pure1 (TL.AppendSymbol "new ")) 5 (Eval (FromList '[ '(5,"a"), '(3,"b")])))
Eval (Adjust (Pure1 (TL.AppendSymbol "new ")) 5 (Eval (FromList '[ '(5,"a"), '(3,"b")]))) :: MapC Nat TL.Symbol = 'MapC '[ '(5, "new a"), '(3, "b")]
>>>
:kind! Eval (Adjust (Pure1 (TL.AppendSymbol "new ")) 7 (Eval (FromList '[ '(5,"a"), '(3,"b")])))
Eval (Adjust (Pure1 (TL.AppendSymbol "new ")) 7 (Eval (FromList '[ '(5,"a"), '(3,"b")]))) :: MapC Nat TL.Symbol = 'MapC '[ '(5, "a"), '(3, "b")]
>>>
:kind! Eval (Adjust (Pure1 (TL.AppendSymbol "new ")) 7 (Eval Empty))
Eval (Adjust (Pure1 (TL.AppendSymbol "new ")) 7 (Eval Empty)) :: MapC Nat TL.Symbol = 'MapC '[]
data AdjustHelp :: (v -> Exp v) -> k -> [(k, v)] -> Exp [(k, v)] Source #
Instances
type Eval (AdjustHelp f k2 ((,) k3 v2 ': rst) :: [(k1, v1)] -> Type) Source # | |
Defined in Fcf.Data.MapC type Eval (AdjustHelp f k2 ((,) k3 v2 ': rst) :: [(k1, v1)] -> Type) = If (Eval (TyEq k2 k3)) ((,) k2 (f @@ v2) ': Eval (AdjustHelp f k2 rst)) ((,) k3 v2 ': Eval (AdjustHelp f k2 rst)) | |
type Eval (AdjustHelp _f _k ([] :: [(k, v)]) :: [(k, v)] -> Type) Source # | |
Defined in Fcf.Data.MapC |
data Lookup :: k -> MapC k v -> Exp (Maybe v) Source #
Lookup
Example
>>>
:kind! Eval (Lookup 5 (Eval (FromList '[ '(5,"a"), '(3,"b")])))
Eval (Lookup 5 (Eval (FromList '[ '(5,"a"), '(3,"b")]))) :: Maybe TL.Symbol = 'Just "a"
>>>
:kind! Eval (Lookup 7 (Eval (FromList '[ '(5,"a"), '(3,"b")])))
Eval (Lookup 7 (Eval (FromList '[ '(5,"a"), '(3,"b")]))) :: Maybe TL.Symbol = 'Nothing
data Member :: k -> MapC k v -> Exp Bool Source #
Member
Example
>>>
:kind! Eval (Member 5 (Eval (FromList '[ '(5,"a"), '(3,"b")])))
Eval (Member 5 (Eval (FromList '[ '(5,"a"), '(3,"b")]))) :: Bool = 'True>>>
:kind! Eval (Member 7 (Eval (FromList '[ '(5,"a"), '(3,"b")])))
Eval (Member 7 (Eval (FromList '[ '(5,"a"), '(3,"b")]))) :: Bool = 'False
data NotMember :: k -> MapC k v -> Exp Bool Source #
NotMember
Example
>>>
:kind! Eval (NotMember 5 (Eval (FromList '[ '(5,"a"), '(3,"b")])))
Eval (NotMember 5 (Eval (FromList '[ '(5,"a"), '(3,"b")]))) :: Bool = 'False>>>
:kind! Eval (NotMember 7 (Eval (FromList '[ '(5,"a"), '(3,"b")])))
Eval (NotMember 7 (Eval (FromList '[ '(5,"a"), '(3,"b")]))) :: Bool = 'True
data Null :: MapC k v -> Exp Bool Source #
Null
Example
>>>
:kind! Eval (Null =<< FromList '[ '(5,"a"), '(3,"b")])
Eval (Null =<< FromList '[ '(5,"a"), '(3,"b")]) :: Bool = 'False>>>
:kind! Eval (Null =<< Empty)
Eval (Null =<< Empty) :: Bool = 'True
data Size :: MapC k v -> Exp Nat Source #
Size
Example
>>>
:kind! Eval (Size =<< FromList '[ '(5,"a"), '(3,"b")])
Eval (Size =<< FromList '[ '(5,"a"), '(3,"b")]) :: Nat = 2
data Union :: MapC k v -> MapC k v -> Exp (MapC k v) Source #
Union
Example
>>>
:kind! Eval (Union (Eval (FromList '[ '(5,"a"), '(3,"b")])) (Eval (FromList '[ '(5,"A"), '(7,"c")])) )
Eval (Union (Eval (FromList '[ '(5,"a"), '(3,"b")])) (Eval (FromList '[ '(5,"A"), '(7,"c")])) ) :: MapC Nat TL.Symbol = 'MapC '[ '(7, "c"), '(5, "a"), '(3, "b")]
data Difference :: MapC k v -> MapC k v -> Exp (MapC k v) Source #
Difference
Example
>>>
:kind! Eval (Difference (Eval (FromList '[ '(3,"a"), '(5,"b")])) (Eval (FromList '[ '(5,"B"), '(7,"C")])))
Eval (Difference (Eval (FromList '[ '(3,"a"), '(5,"b")])) (Eval (FromList '[ '(5,"B"), '(7,"C")]))) :: MapC Nat TL.Symbol = 'MapC '[ '(3, "a")]
Instances
type Eval (Difference mp1 mp2 :: MapC k v -> Type) Source # | |
Defined in Fcf.Data.MapC |
data Intersection :: MapC k v -> MapC k v -> Exp (MapC k v) Source #
Intersection
Example
>>>
:kind! Eval (Intersection (Eval (FromList '[ '(3,"a"), '(5,"b")])) (Eval (FromList '[ '(5,"B"), '(7,"C")])))
Eval (Intersection (Eval (FromList '[ '(3,"a"), '(5,"b")])) (Eval (FromList '[ '(5,"B"), '(7,"C")]))) :: MapC Nat TL.Symbol = 'MapC '[ '(5, "b")]
Instances
type Eval (Intersection mp1 mp2 :: MapC k v -> Type) Source # | |
Defined in Fcf.Data.MapC |
data Disjoint :: MapC k v -> MapC k v -> Exp Bool Source #
Disjoint
Example
>>>
:kind! Eval (Disjoint (Eval (FromList '[ '(3,"a"), '(5,"b")])) (Eval (FromList '[ '(5,"B"), '(7,"C")])))
Eval (Disjoint (Eval (FromList '[ '(3,"a"), '(5,"b")])) (Eval (FromList '[ '(5,"B"), '(7,"C")]))) :: Bool = 'False
>>>
:kind! Eval (Disjoint (Eval (FromList '[ '(3,"a"), '(5,"b")])) (Eval (FromList '[ '(2,"B"), '(7,"C")])))
Eval (Disjoint (Eval (FromList '[ '(3,"a"), '(5,"b")])) (Eval (FromList '[ '(2,"B"), '(7,"C")]))) :: Bool = 'True>>>
:kind! Eval (Disjoint (Eval Empty) (Eval Empty))
Eval (Disjoint (Eval Empty) (Eval Empty)) :: Bool = 'True
data MapWithKey :: (k -> v -> Exp w) -> MapC k v -> Exp (MapC k w) Source #
data Foldr :: (v -> w -> Exp w) -> w -> MapC k v -> Exp w Source #
Foldr
Fold the values in the map using the given right-associative binary operator, such that 'foldr f z == foldr f z . elems'.
Note: the order of values in MapC is not well defined at the moment.
Example
>>>
:kind! Eval (Fcf.Data.MapC.Foldr (Pure2 (TL.+)) 0 =<< (FromList '[ '(1,1), '(2,2)]))
Eval (Fcf.Data.MapC.Foldr (Pure2 (TL.+)) 0 =<< (FromList '[ '(1,1), '(2,2)])) :: Nat = 3
data Elems :: MapC k v -> Exp [v] Source #
Elems
Example
>>>
:kind! Eval (Elems =<< FromList '[ '(5,"a"), '(3,"b")])
Eval (Elems =<< FromList '[ '(5,"a"), '(3,"b")]) :: [TL.Symbol] = '["a", "b"]>>>
:kind! Eval (Elems =<< Empty)
Eval (Elems =<< Empty) :: [v] = '[]
data Keys :: MapC k v -> Exp [k] Source #
Keys
Example
>>>
:kind! Eval (Keys =<< FromList '[ '(5,"a"), '(3,"b")])
Eval (Keys =<< FromList '[ '(5,"a"), '(3,"b")]) :: [Nat] = '[5, 3]>>>
:kind! Eval (Keys =<< Empty)
Eval (Keys =<< Empty) :: [k] = '[]
data Assocs :: MapC k v -> Exp [(k, v)] Source #
Assocs
Example
>>>
:kind! Eval (Assocs =<< FromList '[ '(5,"a"), '(3,"b")])
Eval (Assocs =<< FromList '[ '(5,"a"), '(3,"b")]) :: [(Nat, TL.Symbol)] = '[ '(5, "a"), '(3, "b")]>>>
:kind! Eval (Assocs =<< Empty)
Eval (Assocs =<< Empty) :: [(k, v)] = '[]
data ToList :: MapC k v -> Exp [(k, v)] Source #
ToList
Example
>>>
:kind! Eval (ToList =<< FromList '[ '(5,"a"), '(3,"b")])
Eval (ToList =<< FromList '[ '(5,"a"), '(3,"b")]) :: [(Nat, TL.Symbol)] = '[ '(5, "a"), '(3, "b")]>>>
:kind! Eval (ToList =<< Empty)
Eval (ToList =<< Empty) :: [(k, v)] = '[]
data Filter :: (v -> Exp Bool) -> MapC k v -> Exp (MapC k v) Source #
Filter
Example
>>>
:kind! Eval (Filter ((>=) 35) =<< FromList '[ '(5,50), '(3,30)])
Eval (Filter ((>=) 35) =<< FromList '[ '(5,50), '(3,30)]) :: MapC Nat Nat = 'MapC '[ '(3, 30)]
data FilterWithKey :: (k -> v -> Exp Bool) -> MapC k v -> Exp (MapC k v) Source #
FilterWithKey
Example
>>>
:kind! Eval (FilterWithKey (>=) (Eval (FromList '[ '(3,5), '(6,4)])))
Eval (FilterWithKey (>=) (Eval (FromList '[ '(3,5), '(6,4)]))) :: MapC Nat Nat = 'MapC '[ '(6, 4)]
data Partition :: (v -> Exp Bool) -> MapC k v -> Exp (MapC k v, MapC k v) Source #
Partition
Example
>>>
:kind! Eval (Partition ((>=) 35) =<< FromList '[ '(5,50), '(3,30)])
Eval (Partition ((>=) 35) =<< FromList '[ '(5,50), '(3,30)]) :: (MapC Nat Nat, MapC Nat Nat) = '( 'MapC '[ '(3, 30)], 'MapC '[ '(5, 50)])