{-# 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

-- | A functor-indexed container corrresponding to DMap k v.
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