{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE EmptyCase #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE InstanceSigs #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
module Data.Vessel.DependentMap where
import Data.Aeson
import Data.Bifunctor
import Data.Constraint.Extras
import Data.Constraint.Forall
import Data.Dependent.Map.Monoidal (MonoidalDMap(..))
import Data.Functor.Compose
import Data.GADT.Compare
import Data.Some (Some(Some))
import GHC.Generics
import Data.Functor.Identity
import Data.Dependent.Sum
import Data.Dependent.Sum.Orphans ()
import Data.Set (Set)
import qualified Data.Set as Set
import Data.Patch (Group(..), Additive)
import qualified Data.Dependent.Map as DMap'
import qualified Data.Dependent.Map.Monoidal as DMap
import Data.Vessel.Class
import Data.Vessel.Selectable
import Data.Vessel.Internal
newtype DMapV (k :: * -> *) (v :: * -> *) g = DMapV { DMapV k v g -> MonoidalDMap k (Compose g v)
unDMapV :: MonoidalDMap k (Compose g v) }
deriving ((forall x. DMapV k v g -> Rep (DMapV k v g) x)
-> (forall x. Rep (DMapV k v g) x -> DMapV k v g)
-> Generic (DMapV k v g)
forall x. Rep (DMapV k v g) x -> DMapV k v g
forall x. DMapV k v g -> Rep (DMapV k v g) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall (k :: * -> *) (v :: * -> *) (g :: * -> *) x.
Rep (DMapV k v g) x -> DMapV k v g
forall (k :: * -> *) (v :: * -> *) (g :: * -> *) x.
DMapV k v g -> Rep (DMapV k v g) x
$cto :: forall (k :: * -> *) (v :: * -> *) (g :: * -> *) x.
Rep (DMapV k v g) x -> DMapV k v g
$cfrom :: forall (k :: * -> *) (v :: * -> *) (g :: * -> *) x.
DMapV k v g -> Rep (DMapV k v g) x
Generic)
deriving instance (GCompare k, Has' Eq k (Compose g v)) => Eq (DMapV k v g)
deriving instance (GCompare k, Has' Eq k (Compose g v), Has' Ord k (Compose g v)) => Ord (DMapV k v g)
deriving instance (GCompare k, Has' Semigroup k (Compose g v)) => Semigroup (DMapV k v g)
deriving instance (GCompare k, Has' Semigroup k (Compose g v), Has' Monoid k (Compose g v)) => Monoid (DMapV k v g)
deriving instance (GCompare k, Has' Semigroup k (Compose g v), Has' Monoid k (Compose g v), Has' Group k (Compose g v)) => Group (DMapV k v g)
deriving instance (GCompare k, Has' Semigroup k (Compose g v), Has' Monoid k (Compose g v), Has' Group k (Compose g v), Has' Additive k (Compose g v)) => Additive (DMapV k v g)
instance (Has' ToJSON k (Compose g v), ForallF ToJSON k) => ToJSON (DMapV k v g)
instance (Has' FromJSON k (Compose g v), FromJSON (Some k), GCompare k) => FromJSON (DMapV k v g)
deriving instance (ForallF Show k, Has' Show k (Compose g v)) => Show (DMapV k v g)
instance (GCompare k) => View (DMapV k v) where
cropV :: (forall a. s a -> i a -> r a)
-> DMapV k v s -> DMapV k v i -> Maybe (DMapV k v r)
cropV forall a. s a -> i a -> r a
f (DMapV MonoidalDMap k (Compose s v)
s) (DMapV MonoidalDMap k (Compose i v)
i) = DMapV k v r -> Maybe (DMapV k v r)
forall (v :: (* -> *) -> *) (f :: * -> *).
View v =>
v f -> Maybe (v f)
collapseNullV (DMapV k v r -> Maybe (DMapV k v r))
-> DMapV k v r -> Maybe (DMapV k v r)
forall a b. (a -> b) -> a -> b
$ MonoidalDMap k (Compose r v) -> DMapV k v r
forall (k :: * -> *) (v :: * -> *) (g :: * -> *).
MonoidalDMap k (Compose g v) -> DMapV k v g
DMapV ((forall v. k v -> Compose s v v -> Compose i v v -> Compose r v v)
-> MonoidalDMap k (Compose s v)
-> MonoidalDMap k (Compose i v)
-> MonoidalDMap k (Compose r v)
forall k1 (k2 :: k1 -> *) (f :: k1 -> *) (g :: k1 -> *)
(h :: k1 -> *).
GCompare k2 =>
(forall (v :: k1). k2 v -> f v -> g v -> h v)
-> MonoidalDMap k2 f -> MonoidalDMap k2 g -> MonoidalDMap k2 h
DMap.intersectionWithKey (\k v
_ (Compose x) (Compose y) -> r (v v) -> Compose r v v
forall k k1 (f :: k -> *) (g :: k1 -> k) (a :: k1).
f (g a) -> Compose f g a
Compose (r (v v) -> Compose r v v) -> r (v v) -> Compose r v v
forall a b. (a -> b) -> a -> b
$ s (v v) -> i (v v) -> r (v v)
forall a. s a -> i a -> r a
f s (v v)
x i (v v)
y) MonoidalDMap k (Compose s v)
s MonoidalDMap k (Compose i v)
i)
nullV :: DMapV k v i -> Bool
nullV (DMapV MonoidalDMap k (Compose i v)
m) = MonoidalDMap k (Compose i v) -> Bool
forall k1 (k2 :: k1 -> *) (f :: k1 -> *). MonoidalDMap k2 f -> Bool
DMap.null MonoidalDMap k (Compose i v)
m
condenseV :: t (DMapV k v g) -> DMapV k v (Compose t g)
condenseV t (DMapV k v g)
m = MonoidalDMap k (Compose (Compose t g) v) -> DMapV k v (Compose t g)
forall (k :: * -> *) (v :: * -> *) (g :: * -> *).
MonoidalDMap k (Compose g v) -> DMapV k v g
DMapV (MonoidalDMap k (Compose (Compose t g) v)
-> DMapV k v (Compose t g))
-> (t (DMapV k v g) -> MonoidalDMap k (Compose (Compose t g) v))
-> t (DMapV k v g)
-> DMapV k v (Compose t g)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall v. Compose t (Compose g v) v -> Compose (Compose t g) v v)
-> MonoidalDMap k (Compose t (Compose g v))
-> MonoidalDMap k (Compose (Compose t g) v)
forall k1 (f :: k1 -> *) (g :: k1 -> *) (k2 :: k1 -> *).
(forall (v :: k1). f v -> g v)
-> MonoidalDMap k2 f -> MonoidalDMap k2 g
DMap.map forall v. Compose t (Compose g v) v -> Compose (Compose t g) v v
forall k k1 (f :: * -> *) (g :: k -> *) (h :: k1 -> k) (x :: k1).
Functor f =>
Compose f (Compose g h) x -> Compose (Compose f g) h x
assocLCompose (MonoidalDMap k (Compose t (Compose g v))
-> MonoidalDMap k (Compose (Compose t g) v))
-> (t (DMapV k v g) -> MonoidalDMap k (Compose t (Compose g v)))
-> t (DMapV k v g)
-> MonoidalDMap k (Compose (Compose t g) v)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. t (MonoidalDMap k (Compose g v))
-> MonoidalDMap k (Compose t (Compose g v))
forall (v :: (* -> *) -> *) (t :: * -> *) (g :: * -> *).
(View v, Foldable t, Filterable t, Functor t) =>
t (v g) -> v (Compose t g)
condenseV (t (MonoidalDMap k (Compose g v))
-> MonoidalDMap k (Compose t (Compose g v)))
-> (t (DMapV k v g) -> t (MonoidalDMap k (Compose g v)))
-> t (DMapV k v g)
-> MonoidalDMap k (Compose t (Compose g v))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (DMapV k v g -> MonoidalDMap k (Compose g v))
-> t (DMapV k v g) -> t (MonoidalDMap k (Compose g v))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap DMapV k v g -> MonoidalDMap k (Compose g v)
forall (k :: * -> *) (v :: * -> *) (g :: * -> *).
DMapV k v g -> MonoidalDMap k (Compose g v)
unDMapV (t (DMapV k v g) -> DMapV k v (Compose t g))
-> t (DMapV k v g) -> DMapV k v (Compose t g)
forall a b. (a -> b) -> a -> b
$ t (DMapV k v g)
m
disperseV :: DMapV k v (Compose t g) -> t (DMapV k v g)
disperseV (DMapV MonoidalDMap k (Compose (Compose t g) v)
m) = (MonoidalDMap k (Compose g v) -> DMapV k v g)
-> t (MonoidalDMap k (Compose g v)) -> t (DMapV k v g)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap MonoidalDMap k (Compose g v) -> DMapV k v g
forall (k :: * -> *) (v :: * -> *) (g :: * -> *).
MonoidalDMap k (Compose g v) -> DMapV k v g
DMapV (t (MonoidalDMap k (Compose g v)) -> t (DMapV k v g))
-> (MonoidalDMap k (Compose (Compose t g) v)
-> t (MonoidalDMap k (Compose g v)))
-> MonoidalDMap k (Compose (Compose t g) v)
-> t (DMapV k v g)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MonoidalDMap k (Compose t (Compose g v))
-> t (MonoidalDMap k (Compose g v))
forall (v :: (* -> *) -> *) (t :: * -> *) (g :: * -> *).
(View v, Align t) =>
v (Compose t g) -> t (v g)
disperseV (MonoidalDMap k (Compose t (Compose g v))
-> t (MonoidalDMap k (Compose g v)))
-> (MonoidalDMap k (Compose (Compose t g) v)
-> MonoidalDMap k (Compose t (Compose g v)))
-> MonoidalDMap k (Compose (Compose t g) v)
-> t (MonoidalDMap k (Compose g v))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall v. Compose (Compose t g) v v -> Compose t (Compose g v) v)
-> MonoidalDMap k (Compose (Compose t g) v)
-> MonoidalDMap k (Compose t (Compose g v))
forall k1 (f :: k1 -> *) (g :: k1 -> *) (k2 :: k1 -> *).
(forall (v :: k1). f v -> g v)
-> MonoidalDMap k2 f -> MonoidalDMap k2 g
DMap.map forall v. Compose (Compose t g) v v -> Compose t (Compose g v) v
forall k k1 (f :: * -> *) (g :: k -> *) (h :: k1 -> k) (x :: k1).
Functor f =>
Compose (Compose f g) h x -> Compose f (Compose g h) x
assocRCompose (MonoidalDMap k (Compose (Compose t g) v) -> t (DMapV k v g))
-> MonoidalDMap k (Compose (Compose t g) v) -> t (DMapV k v g)
forall a b. (a -> b) -> a -> b
$ MonoidalDMap k (Compose (Compose t g) v)
m
mapV :: (forall a. f a -> g a) -> DMapV k v f -> DMapV k v g
mapV forall a. f a -> g a
f (DMapV MonoidalDMap k (Compose f v)
m) = MonoidalDMap k (Compose g v) -> DMapV k v g
forall (k :: * -> *) (v :: * -> *) (g :: * -> *).
MonoidalDMap k (Compose g v) -> DMapV k v g
DMapV (MonoidalDMap k (Compose g v) -> DMapV k v g)
-> MonoidalDMap k (Compose g v) -> DMapV k v g
forall a b. (a -> b) -> a -> b
$ (forall v. Compose f v v -> Compose g v v)
-> MonoidalDMap k (Compose f v) -> MonoidalDMap k (Compose g v)
forall k1 (f :: k1 -> *) (g :: k1 -> *) (k2 :: k1 -> *).
(forall (v :: k1). f v -> g v)
-> MonoidalDMap k2 f -> MonoidalDMap k2 g
DMap.map (\(Compose x) -> g (v v) -> Compose g v v
forall k k1 (f :: k -> *) (g :: k1 -> k) (a :: k1).
f (g a) -> Compose f g a
Compose (f (v v) -> g (v v)
forall a. f a -> g a
f f (v v)
x)) MonoidalDMap k (Compose f v)
m
traverseV :: (forall a. f a -> m (g a)) -> DMapV k v f -> m (DMapV k v g)
traverseV forall a. f a -> m (g a)
f (DMapV MonoidalDMap k (Compose f v)
m) = MonoidalDMap k (Compose g v) -> DMapV k v g
forall (k :: * -> *) (v :: * -> *) (g :: * -> *).
MonoidalDMap k (Compose g v) -> DMapV k v g
DMapV (MonoidalDMap k (Compose g v) -> DMapV k v g)
-> m (MonoidalDMap k (Compose g v)) -> m (DMapV k v g)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (forall v. k v -> Compose f v v -> m (Compose g v v))
-> MonoidalDMap k (Compose f v) -> m (MonoidalDMap k (Compose g v))
forall k1 (t :: * -> *) (k2 :: k1 -> *) (f :: k1 -> *)
(g :: k1 -> *).
Applicative t =>
(forall (v :: k1). k2 v -> f v -> t (g v))
-> MonoidalDMap k2 f -> t (MonoidalDMap k2 g)
DMap.traverseWithKey (\k v
_ (Compose x) -> g (v v) -> Compose g v v
forall k k1 (f :: k -> *) (g :: k1 -> k) (a :: k1).
f (g a) -> Compose f g a
Compose (g (v v) -> Compose g v v) -> m (g (v v)) -> m (Compose g v v)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> f (v v) -> m (g (v v))
forall a. f a -> m (g a)
f f (v v)
x) MonoidalDMap k (Compose f v)
m
mapMaybeV :: (forall a. f a -> Maybe (g a))
-> DMapV k v f -> Maybe (DMapV k v g)
mapMaybeV forall a. f a -> Maybe (g a)
f (DMapV (MonoidalDMap DMap k (Compose f v)
m)) = DMapV k v g -> Maybe (DMapV k v g)
forall (v :: (* -> *) -> *) (f :: * -> *).
View v =>
v f -> Maybe (v f)
collapseNullV (DMapV k v g -> Maybe (DMapV k v g))
-> DMapV k v g -> Maybe (DMapV k v g)
forall a b. (a -> b) -> a -> b
$ MonoidalDMap k (Compose g v) -> DMapV k v g
forall (k :: * -> *) (v :: * -> *) (g :: * -> *).
MonoidalDMap k (Compose g v) -> DMapV k v g
DMapV (MonoidalDMap k (Compose g v) -> DMapV k v g)
-> MonoidalDMap k (Compose g v) -> DMapV k v g
forall a b. (a -> b) -> a -> b
$ DMap k (Compose g v) -> MonoidalDMap k (Compose g v)
forall k (f :: k -> *) (g :: k -> *). DMap f g -> MonoidalDMap f g
MonoidalDMap (DMap k (Compose g v) -> MonoidalDMap k (Compose g v))
-> DMap k (Compose g v) -> MonoidalDMap k (Compose g v)
forall a b. (a -> b) -> a -> b
$
(forall v. Compose f v v -> Maybe (Compose g v v))
-> DMap k (Compose f v) -> DMap k (Compose g v)
forall k1 (k2 :: k1 -> *) (f :: k1 -> *) (g :: k1 -> *).
GCompare k2 =>
(forall (v :: k1). f v -> Maybe (g v)) -> DMap k2 f -> DMap k2 g
DMap'.mapMaybe ((g (v v) -> Compose g v v)
-> Maybe (g (v v)) -> Maybe (Compose g v v)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap g (v v) -> Compose g v v
forall k k1 (f :: k -> *) (g :: k1 -> k) (a :: k1).
f (g a) -> Compose f g a
Compose (Maybe (g (v v)) -> Maybe (Compose g v v))
-> (Compose f v v -> Maybe (g (v v)))
-> Compose f v v
-> Maybe (Compose g v v)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. f (v v) -> Maybe (g (v v))
forall a. f a -> Maybe (g a)
f (f (v v) -> Maybe (g (v v)))
-> (Compose f v v -> f (v v)) -> Compose f v v -> Maybe (g (v v))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Compose f v v -> f (v v)
forall k1 (f :: k1 -> *) k2 (g :: k2 -> k1) (a :: k2).
Compose f g a -> f (g a)
getCompose) DMap k (Compose f v)
m
alignWithV :: (forall a. These (f a) (g a) -> h a)
-> DMapV k v f -> DMapV k v g -> DMapV k v h
alignWithV forall a. These (f a) (g a) -> h a
f (DMapV MonoidalDMap k (Compose f v)
a) (DMapV MonoidalDMap k (Compose g v)
b) = MonoidalDMap k (Compose h v) -> DMapV k v h
forall (k :: * -> *) (v :: * -> *) (g :: * -> *).
MonoidalDMap k (Compose g v) -> DMapV k v g
DMapV ((forall a.
k a -> These (Compose f v a) (Compose g v a) -> Compose h v a)
-> MonoidalDMap k (Compose f v)
-> MonoidalDMap k (Compose g v)
-> MonoidalDMap k (Compose h v)
forall k1 (k2 :: k1 -> *) (f :: k1 -> *) (g :: k1 -> *)
(h :: k1 -> *).
GCompare k2 =>
(forall (a :: k1). k2 a -> These (f a) (g a) -> h a)
-> MonoidalDMap k2 f -> MonoidalDMap k2 g -> MonoidalDMap k2 h
alignWithKeyMonoidalDMap (\k a
_ These (Compose f v a) (Compose g v a)
x -> h (v a) -> Compose h v a
forall k k1 (f :: k -> *) (g :: k1 -> k) (a :: k1).
f (g a) -> Compose f g a
Compose (h (v a) -> Compose h v a)
-> (These (f (v a)) (g (v a)) -> h (v a))
-> These (f (v a)) (g (v a))
-> Compose h v a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. These (f (v a)) (g (v a)) -> h (v a)
forall a. These (f a) (g a) -> h a
f (These (f (v a)) (g (v a)) -> Compose h v a)
-> These (f (v a)) (g (v a)) -> Compose h v a
forall a b. (a -> b) -> a -> b
$ (Compose f v a -> f (v a))
-> (Compose g v a -> g (v a))
-> These (Compose f v a) (Compose g v a)
-> These (f (v a)) (g (v a))
forall (p :: * -> * -> *) a b c d.
Bifunctor p =>
(a -> b) -> (c -> d) -> p a c -> p b d
bimap Compose f v a -> f (v a)
forall k1 (f :: k1 -> *) k2 (g :: k2 -> k1) (a :: k2).
Compose f g a -> f (g a)
getCompose Compose g v a -> g (v a)
forall k1 (f :: k1 -> *) k2 (g :: k2 -> k1) (a :: k2).
Compose f g a -> f (g a)
getCompose These (Compose f v a) (Compose g v a)
x) MonoidalDMap k (Compose f v)
a MonoidalDMap k (Compose g v)
b)
alignWithMaybeV :: (forall a. These (f a) (g a) -> Maybe (h a))
-> DMapV k v f -> DMapV k v g -> Maybe (DMapV k v h)
alignWithMaybeV forall a. These (f a) (g a) -> Maybe (h a)
f (DMapV MonoidalDMap k (Compose f v)
a) (DMapV MonoidalDMap k (Compose g v)
b) = DMapV k v h -> Maybe (DMapV k v h)
forall (v :: (* -> *) -> *) (f :: * -> *).
View v =>
v f -> Maybe (v f)
collapseNullV (DMapV k v h -> Maybe (DMapV k v h))
-> (MonoidalDMap k (Compose h v) -> DMapV k v h)
-> MonoidalDMap k (Compose h v)
-> Maybe (DMapV k v h)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MonoidalDMap k (Compose h v) -> DMapV k v h
forall (k :: * -> *) (v :: * -> *) (g :: * -> *).
MonoidalDMap k (Compose g v) -> DMapV k v g
DMapV (MonoidalDMap k (Compose h v) -> Maybe (DMapV k v h))
-> MonoidalDMap k (Compose h v) -> Maybe (DMapV k v h)
forall a b. (a -> b) -> a -> b
$
(forall a.
k a
-> These (Compose f v a) (Compose g v a) -> Maybe (Compose h v a))
-> MonoidalDMap k (Compose f v)
-> MonoidalDMap k (Compose g v)
-> MonoidalDMap k (Compose h v)
forall k1 (k2 :: k1 -> *) (f :: k1 -> *) (g :: k1 -> *)
(h :: k1 -> *).
GCompare k2 =>
(forall (a :: k1). k2 a -> These (f a) (g a) -> Maybe (h a))
-> MonoidalDMap k2 f -> MonoidalDMap k2 g -> MonoidalDMap k2 h
alignWithKeyMaybeMonoidalDMap (\k a
_ These (Compose f v a) (Compose g v a)
x -> (h (v a) -> Compose h v a)
-> Maybe (h (v a)) -> Maybe (Compose h v a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap h (v a) -> Compose h v a
forall k k1 (f :: k -> *) (g :: k1 -> k) (a :: k1).
f (g a) -> Compose f g a
Compose (Maybe (h (v a)) -> Maybe (Compose h v a))
-> Maybe (h (v a)) -> Maybe (Compose h v a)
forall a b. (a -> b) -> a -> b
$ These (f (v a)) (g (v a)) -> Maybe (h (v a))
forall a. These (f a) (g a) -> Maybe (h a)
f ((Compose f v a -> f (v a))
-> (Compose g v a -> g (v a))
-> These (Compose f v a) (Compose g v a)
-> These (f (v a)) (g (v a))
forall (p :: * -> * -> *) a b c d.
Bifunctor p =>
(a -> b) -> (c -> d) -> p a c -> p b d
bimap Compose f v a -> f (v a)
forall k1 (f :: k1 -> *) k2 (g :: k2 -> k1) (a :: k2).
Compose f g a -> f (g a)
getCompose Compose g v a -> g (v a)
forall k1 (f :: k1 -> *) k2 (g :: k2 -> k1) (a :: k2).
Compose f g a -> f (g a)
getCompose These (Compose f v a) (Compose g v a)
x)) MonoidalDMap k (Compose f v)
a MonoidalDMap k (Compose g v)
b
instance (GCompare k) => EmptyView (DMapV k v) where
emptyV :: DMapV k v f
emptyV = MonoidalDMap k (Compose f v) -> DMapV k v f
forall (k :: * -> *) (v :: * -> *) (g :: * -> *).
MonoidalDMap k (Compose g v) -> DMapV k v g
DMapV MonoidalDMap k (Compose f v)
forall k1 (k2 :: k1 -> *) (f :: k1 -> *). MonoidalDMap k2 f
DMap.empty
instance (GCompare k) => Selectable (DMapV k v) (Set (Some k)) where
type Selection (DMapV k v) (Set (Some k)) = MonoidalDMap k v
selector :: (forall a. p a) -> Set (Some k) -> DMapV k v p
selector forall a. p a
p Set (Some k)
s = MonoidalDMap k (Compose p v) -> DMapV k v p
forall (k :: * -> *) (v :: * -> *) (g :: * -> *).
MonoidalDMap k (Compose g v) -> DMapV k v g
DMapV (MonoidalDMap k (Compose p v) -> DMapV k v p)
-> ([DSum k (Compose p v)] -> MonoidalDMap k (Compose p v))
-> [DSum k (Compose p v)]
-> DMapV k v p
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall v. k v -> Compose p v v -> Compose p v v -> Compose p v v)
-> [DSum k (Compose p v)] -> MonoidalDMap k (Compose p v)
forall k1 (k2 :: k1 -> *) (f :: k1 -> *).
GCompare k2 =>
(forall (v :: k1). k2 v -> f v -> f v -> f v)
-> [DSum k2 f] -> MonoidalDMap k2 f
DMap.fromListWithKey (\k v
_ Compose p v v
x Compose p v v
_ -> Compose p v v
x) ([DSum k (Compose p v)] -> DMapV k v p)
-> [DSum k (Compose p v)] -> DMapV k v p
forall a b. (a -> b) -> a -> b
$
(Some k -> DSum k (Compose p v))
-> [Some k] -> [DSum k (Compose p v)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\(Some k a
k) -> k a
k k a -> Compose p v a -> DSum k (Compose p v)
forall k (tag :: k -> *) (f :: k -> *) (a :: k).
tag a -> f a -> DSum tag f
:=> p (v a) -> Compose p v a
forall k k1 (f :: k -> *) (g :: k1 -> k) (a :: k1).
f (g a) -> Compose f g a
Compose p (v a)
forall a. p a
p) (Set (Some k) -> [Some k]
forall a. Set a -> [a]
Set.toList Set (Some k)
s)
selection :: Set (Some k)
-> DMapV k v Identity -> Selection (DMapV k v) (Set (Some k))
selection Set (Some k)
_ (DMapV MonoidalDMap k (Compose Identity v)
m) = (forall v. Compose Identity v v -> v v)
-> MonoidalDMap k (Compose Identity v) -> MonoidalDMap k v
forall k1 (f :: k1 -> *) (g :: k1 -> *) (k2 :: k1 -> *).
(forall (v :: k1). f v -> g v)
-> MonoidalDMap k2 f -> MonoidalDMap k2 g
DMap.map (\(Compose (Identity v)) -> v v
v) MonoidalDMap k (Compose Identity v)
m