{-# 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.Vessel where

import Control.Applicative
import Control.Arrow ((***))
import Control.Monad
import Data.Aeson
import Data.Some (Some)
import Data.Constraint.Extras
import Data.Functor.Identity
import Data.Proxy
import Data.Dependent.Sum
import Data.Dependent.Sum.Orphans ()
import Data.Constraint.Forall
import Data.Dependent.Map.Monoidal (MonoidalDMap(..))
import Data.Dependent.Map.Internal (DMap (..))
import Data.Foldable hiding (null)
import qualified Data.Dependent.Map.Monoidal as DMap
import Data.GADT.Compare
import Data.GADT.Show
import Data.Witherable
import Data.Vessel.Internal
import GHC.Generics
import Reflex.Query.Class
import Data.Patch (Group(..), Additive)
import Data.Functor.Compose
import Data.Align
import qualified Data.Dependent.Map as DMap'
import Data.Maybe (fromMaybe)
import Data.These

import Data.Vessel.Class hiding (empty)
import Data.Vessel.DependentMap
import Data.Vessel.ViewMorphism

------- Vessel -------

-- | This type is a container for storing an arbitrary collection of functor-parametric container types of the sort
-- discussed above, keyed by a GADT whose index will specify which sort of container goes in each position.
--
-- Ordinary types with values have kind *
-- Functors have kind * -> *
-- Containers taking a functor as a parameter then have kind (* -> *) -> *
-- The keys of a vessel are indexed by a functor-parametric container type, so they have kind ((* -> *) -> *) -> *
-- Vessel itself, for any such key type, produces a functor-parametric container, so it has kind
-- (((* -> *) -> *) -> *) -> (* -> *) -> *
-- Law: None of the items in the Vessel's MonoidalDMap are nullV
newtype Vessel (k :: ((* -> *) -> *) -> *) (g :: * -> *) = Vessel { Vessel k g -> MonoidalDMap k (FlipAp g)
unVessel :: MonoidalDMap k (FlipAp g) }
  deriving ((forall x. Vessel k g -> Rep (Vessel k g) x)
-> (forall x. Rep (Vessel k g) x -> Vessel k g)
-> Generic (Vessel k g)
forall x. Rep (Vessel k g) x -> Vessel k g
forall x. Vessel k g -> Rep (Vessel k g) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall (k :: ((* -> *) -> *) -> *) (g :: * -> *) x.
Rep (Vessel k g) x -> Vessel k g
forall (k :: ((* -> *) -> *) -> *) (g :: * -> *) x.
Vessel k g -> Rep (Vessel k g) x
$cto :: forall (k :: ((* -> *) -> *) -> *) (g :: * -> *) x.
Rep (Vessel k g) x -> Vessel k g
$cfrom :: forall (k :: ((* -> *) -> *) -> *) (g :: * -> *) x.
Vessel k g -> Rep (Vessel k g) x
Generic)

deriving instance (GCompare k, Has' Eq k (FlipAp g)) => Eq (Vessel k g)

deriving instance (ForallF Show k, GShow k, Has' Show k (FlipAp g)) => Show (Vessel k g)

-- TODO: Ord, Read, Show

instance (Has View k, GCompare k, Has' Semigroup k (FlipAp Identity)) => Query (Vessel k (Const x)) where
  type QueryResult (Vessel k (Const x)) = Vessel k Identity
  crop :: Vessel k (Const x)
-> QueryResult (Vessel k (Const x))
-> QueryResult (Vessel k (Const x))
crop Vessel k (Const x)
q QueryResult (Vessel k (Const x))
r = Vessel k Identity -> Maybe (Vessel k Identity) -> Vessel k Identity
forall a. a -> Maybe a -> a
fromMaybe Vessel k Identity
forall (v :: (* -> *) -> *) (f :: * -> *). EmptyView v => v f
emptyV (Maybe (Vessel k Identity) -> Vessel k Identity)
-> Maybe (Vessel k Identity) -> Vessel k Identity
forall a b. (a -> b) -> a -> b
$ (forall a. Const x a -> Identity a -> Identity a)
-> Vessel k (Const x)
-> Vessel k Identity
-> Maybe (Vessel k Identity)
forall (v :: (* -> *) -> *) (s :: * -> *) (i :: * -> *)
       (r :: * -> *).
View v =>
(forall a. s a -> i a -> r a) -> v s -> v i -> Maybe (v r)
cropV (\Const x a
_ Identity a
a -> Identity a
a) Vessel k (Const x)
q QueryResult (Vessel k (Const x))
Vessel k Identity
r --TODO

instance (Has View k, GCompare k, Has' Semigroup k (FlipAp Identity)) => Query (Vessel k Proxy) where
  type QueryResult (Vessel k Proxy) = Vessel k Identity
  crop :: Vessel k Proxy
-> QueryResult (Vessel k Proxy) -> QueryResult (Vessel k Proxy)
crop Vessel k Proxy
q QueryResult (Vessel k Proxy)
r = Vessel k Identity -> Maybe (Vessel k Identity) -> Vessel k Identity
forall a. a -> Maybe a -> a
fromMaybe Vessel k Identity
forall (v :: (* -> *) -> *) (f :: * -> *). EmptyView v => v f
emptyV (Maybe (Vessel k Identity) -> Vessel k Identity)
-> Maybe (Vessel k Identity) -> Vessel k Identity
forall a b. (a -> b) -> a -> b
$ (forall a. Proxy a -> Identity a -> Identity a)
-> Vessel k Proxy -> Vessel k Identity -> Maybe (Vessel k Identity)
forall (v :: (* -> *) -> *) (s :: * -> *) (i :: * -> *)
       (r :: * -> *).
View v =>
(forall a. s a -> i a -> r a) -> v s -> v i -> Maybe (v r)
cropV (\Proxy a
_ Identity a
a -> Identity a
a) Vessel k Proxy
q QueryResult (Vessel k Proxy)
Vessel k Identity
r --TODO


instance (GCompare k, ForallF ToJSON k, HasV ToJSON k g) => ToJSON (Vessel k g) where
  toJSON :: Vessel k g -> Value
toJSON Vessel k g
v = [VSum k g] -> Value
forall a. ToJSON a => a -> Value
toJSON (Vessel k g -> [VSum k g]
forall (k :: ((* -> *) -> *) -> *) (g :: * -> *).
Vessel k g -> [VSum k g]
toListV Vessel k g
v)

instance (GCompare k, FromJSON (Some k), HasV FromJSON k g, Has View k) => FromJSON (Vessel k g) where
  parseJSON :: Value -> Parser (Vessel k g)
parseJSON Value
x = ([VSum k g] -> Vessel k g)
-> Parser [VSum k g] -> Parser (Vessel k g)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [VSum k g] -> Vessel k g
forall (k :: ((* -> *) -> *) -> *) (g :: * -> *).
(GCompare k, Has View k) =>
[VSum k g] -> Vessel k g
fromListV (Value -> Parser [VSum k g]
forall a. FromJSON a => Value -> Parser a
parseJSON Value
x)

-- TODO: figure out how to write a single instance for the case of Compose which depends on a Query instance for the right hand
-- composed functor... and/or let's replace Query with something more appropriate since it's pretty uniform what we want the crop
-- function to be all the time now.

type family VesselLeafWrapper v where
  VesselLeafWrapper (Vessel k g) = g

instance ( Has View k
         , GCompare k
         , Has' Semigroup k (FlipAp (Compose c (VesselLeafWrapper (QueryResult (Vessel k g)))))
         , Query (Vessel k g) )
        => Query (Vessel k (Compose c g)) where
  type QueryResult (Vessel k (Compose c g)) = Vessel k (Compose c (VesselLeafWrapper (QueryResult (Vessel k g))))
  crop :: Vessel k (Compose c g)
-> QueryResult (Vessel k (Compose c g))
-> QueryResult (Vessel k (Compose c g))
crop Vessel k (Compose c g)
q QueryResult (Vessel k (Compose c g))
r = Vessel k (Compose c (VesselLeafWrapper (QueryResult (Vessel k g))))
-> Maybe
     (Vessel
        k (Compose c (VesselLeafWrapper (QueryResult (Vessel k g)))))
-> Vessel
     k (Compose c (VesselLeafWrapper (QueryResult (Vessel k g))))
forall a. a -> Maybe a -> a
fromMaybe Vessel k (Compose c (VesselLeafWrapper (QueryResult (Vessel k g))))
forall (v :: (* -> *) -> *) (f :: * -> *). EmptyView v => v f
emptyV (Maybe
   (Vessel
      k (Compose c (VesselLeafWrapper (QueryResult (Vessel k g)))))
 -> Vessel
      k (Compose c (VesselLeafWrapper (QueryResult (Vessel k g)))))
-> Maybe
     (Vessel
        k (Compose c (VesselLeafWrapper (QueryResult (Vessel k g)))))
-> Vessel
     k (Compose c (VesselLeafWrapper (QueryResult (Vessel k g))))
forall a b. (a -> b) -> a -> b
$ (forall a.
 Compose c g a
 -> Compose c (VesselLeafWrapper (QueryResult (Vessel k g))) a
 -> Compose c (VesselLeafWrapper (QueryResult (Vessel k g))) a)
-> Vessel k (Compose c g)
-> Vessel
     k (Compose c (VesselLeafWrapper (QueryResult (Vessel k g))))
-> Maybe
     (Vessel
        k (Compose c (VesselLeafWrapper (QueryResult (Vessel k g)))))
forall (v :: (* -> *) -> *) (s :: * -> *) (i :: * -> *)
       (r :: * -> *).
View v =>
(forall a. s a -> i a -> r a) -> v s -> v i -> Maybe (v r)
cropV (\Compose c g a
_ Compose c (VesselLeafWrapper (QueryResult (Vessel k g))) a
a -> Compose c (VesselLeafWrapper (QueryResult (Vessel k g))) a
a) Vessel k (Compose c g)
q QueryResult (Vessel k (Compose c g))
Vessel k (Compose c (VesselLeafWrapper (QueryResult (Vessel k g))))
r

instance (Has' Semigroup k (FlipAp g), GCompare k, Has View k) => Semigroup (Vessel k g) where
  Vessel MonoidalDMap k (FlipAp g)
m <> :: Vessel k g -> Vessel k g -> Vessel k g
<> Vessel MonoidalDMap k (FlipAp g)
n = MonoidalDMap k (FlipAp g) -> Vessel k g
forall (k :: ((* -> *) -> *) -> *) (g :: * -> *).
MonoidalDMap k (FlipAp g) -> Vessel k g
Vessel (MonoidalDMap k (FlipAp g) -> Vessel k g)
-> MonoidalDMap k (FlipAp g) -> Vessel k g
forall a b. (a -> b) -> a -> b
$ MonoidalDMap k (FlipAp g) -> MonoidalDMap k (FlipAp g)
forall (k :: ((* -> *) -> *) -> *) (f :: * -> *).
(GCompare k, Has View k) =>
MonoidalDMap k (FlipAp f) -> MonoidalDMap k (FlipAp f)
filterNullFlipAps (MonoidalDMap k (FlipAp g) -> MonoidalDMap k (FlipAp g))
-> MonoidalDMap k (FlipAp g) -> MonoidalDMap k (FlipAp g)
forall a b. (a -> b) -> a -> b
$ MonoidalDMap k (FlipAp g)
m MonoidalDMap k (FlipAp g)
-> MonoidalDMap k (FlipAp g) -> MonoidalDMap k (FlipAp g)
forall a. Semigroup a => a -> a -> a
<> MonoidalDMap k (FlipAp g)
n

instance (Has' Semigroup k (FlipAp g), GCompare k, Has View k) => Monoid (Vessel k g) where
  mempty :: Vessel k g
mempty = MonoidalDMap k (FlipAp g) -> Vessel k g
forall (k :: ((* -> *) -> *) -> *) (g :: * -> *).
MonoidalDMap k (FlipAp g) -> Vessel k g
Vessel MonoidalDMap k (FlipAp g)
forall k1 (k2 :: k1 -> *) (f :: k1 -> *). MonoidalDMap k2 f
DMap.empty
  mappend :: Vessel k g -> Vessel k g -> Vessel k g
mappend = Vessel k g -> Vessel k g -> Vessel k g
forall a. Semigroup a => a -> a -> a
(<>)

instance (Has' Semigroup k (FlipAp g), Has' Group k (FlipAp g), GCompare k, Has View k) => Group (Vessel k g) where
  negateG :: Vessel k g -> Vessel k g
negateG (Vessel MonoidalDMap k (FlipAp g)
m) = MonoidalDMap k (FlipAp g) -> Vessel k g
forall (k :: ((* -> *) -> *) -> *) (g :: * -> *).
MonoidalDMap k (FlipAp g) -> Vessel k g
Vessel (MonoidalDMap k (FlipAp g) -> MonoidalDMap k (FlipAp g)
forall q. Group q => q -> q
negateG MonoidalDMap k (FlipAp g)
m) --TODO: Do we know that nullV can't be the result of negateG?

instance (Has' Additive k (FlipAp g), Has' Semigroup k (FlipAp g), GCompare k, Has View k) => Additive (Vessel k g)

------- The View instance for Vessel itself --------

instance (Has View k, GCompare k) => View (Vessel k) where
  cropV :: (forall a. s a -> i a -> r a) -> Vessel k s -> Vessel k i -> Maybe (Vessel k r)
  cropV :: (forall a. s a -> i a -> r a)
-> Vessel k s -> Vessel k i -> Maybe (Vessel k r)
cropV forall a. s a -> i a -> r a
f Vessel k s
sv Vessel k i
iv = Vessel k r -> Maybe (Vessel k r)
forall (v :: (* -> *) -> *) (f :: * -> *).
View v =>
v f -> Maybe (v f)
collapseNullV (Vessel k r -> Maybe (Vessel k r))
-> Vessel k r -> Maybe (Vessel k r)
forall a b. (a -> b) -> a -> b
$ (forall (v :: (* -> *) -> *).
 View v =>
 k v -> v s -> v i -> Maybe (v r))
-> Vessel k s -> Vessel k i -> Vessel k r
forall (k :: ((* -> *) -> *) -> *) (g :: * -> *) (g' :: * -> *)
       (h :: * -> *).
(GCompare k, Has View k) =>
(forall (v :: (* -> *) -> *).
 View v =>
 k v -> v g -> v g' -> Maybe (v h))
-> Vessel k g -> Vessel k g' -> Vessel k h
intersectionMaybeWithKeyV (\k v
k v s
s v i
i -> k v -> (View v => Maybe (v r)) -> Maybe (v r)
forall k (c :: k -> Constraint) (f :: k -> *) (a :: k) r.
Has c f =>
f a -> (c a => r) -> r
has @View k v
k ((forall a. s a -> i a -> r a) -> v s -> v i -> Maybe (v r)
forall (v :: (* -> *) -> *) (s :: * -> *) (i :: * -> *)
       (r :: * -> *).
View v =>
(forall a. s a -> i a -> r a) -> v s -> v i -> Maybe (v r)
cropV forall a. s a -> i a -> r a
f v s
s v i
i)) Vessel k s
sv Vessel k i
iv
  nullV :: Vessel k i -> Bool
  nullV :: Vessel k i -> Bool
nullV (Vessel MonoidalDMap k (FlipAp i)
m) = MonoidalDMap k (FlipAp i) -> Bool
forall k1 (k2 :: k1 -> *) (f :: k1 -> *). MonoidalDMap k2 f -> Bool
DMap.null MonoidalDMap k (FlipAp i)
m
  mapV :: (forall a. f a -> g a) -> Vessel k f -> Vessel k g
  mapV :: (forall a. f a -> g a) -> Vessel k f -> Vessel k g
mapV forall a. f a -> g a
f (Vessel MonoidalDMap k (FlipAp f)
m) = MonoidalDMap k (FlipAp g) -> Vessel k g
forall (k :: ((* -> *) -> *) -> *) (g :: * -> *).
MonoidalDMap k (FlipAp g) -> Vessel k g
Vessel ((forall (v :: (* -> *) -> *). k v -> FlipAp f v -> FlipAp g v)
-> MonoidalDMap k (FlipAp f) -> MonoidalDMap k (FlipAp g)
forall k1 (k2 :: k1 -> *) (f :: k1 -> *) (g :: k1 -> *).
(forall (v :: k1). k2 v -> f v -> g v)
-> MonoidalDMap k2 f -> MonoidalDMap k2 g
DMap.mapWithKey (\k v
k (FlipAp v) -> k v -> (View v => FlipAp g v) -> FlipAp g v
forall k (c :: k -> Constraint) (f :: k -> *) (a :: k) r.
Has c f =>
f a -> (c a => r) -> r
has @View k v
k ((View v => FlipAp g v) -> FlipAp g v)
-> (View v => FlipAp g v) -> FlipAp g v
forall a b. (a -> b) -> a -> b
$ v g -> FlipAp g v
forall k (g :: k) (v :: k -> *). v g -> FlipAp g v
FlipAp ((forall a. f a -> g a) -> v f -> v g
forall (v :: (* -> *) -> *) (f :: * -> *) (g :: * -> *).
View v =>
(forall a. f a -> g a) -> v f -> v g
mapV forall a. f a -> g a
f v f
v)) MonoidalDMap k (FlipAp f)
m)
  traverseV :: (Applicative m) => (forall a. f a -> m (g a)) -> Vessel k f -> m (Vessel k g)
  traverseV :: (forall a. f a -> m (g a)) -> Vessel k f -> m (Vessel k g)
traverseV forall a. f a -> m (g a)
f Vessel k f
m = (forall (v :: (* -> *) -> *). View v => k v -> v f -> m (v g))
-> Vessel k f -> m (Vessel k g)
forall (k :: ((* -> *) -> *) -> *) (m :: * -> *) (g :: * -> *)
       (h :: * -> *).
(GCompare k, Has View k, Applicative m) =>
(forall (v :: (* -> *) -> *). View v => k v -> v g -> m (v h))
-> Vessel k g -> m (Vessel k h)
traverseWithKeyV (\k v
k v f
v -> k v -> (View v => m (v g)) -> m (v g)
forall k (c :: k -> Constraint) (f :: k -> *) (a :: k) r.
Has c f =>
f a -> (c a => r) -> r
has @View k v
k ((View v => m (v g)) -> m (v g)) -> (View v => m (v g)) -> m (v g)
forall a b. (a -> b) -> a -> b
$ (forall a. f a -> m (g a)) -> v f -> m (v g)
forall (v :: (* -> *) -> *) (m :: * -> *) (f :: * -> *)
       (g :: * -> *).
(View v, Applicative m) =>
(forall a. f a -> m (g a)) -> v f -> m (v g)
traverseV forall a. f a -> m (g a)
f v f
v) Vessel k f
m
  condenseV :: (Foldable t, Filterable t, Functor t)
            => t (Vessel k g)
            -> Vessel k (Compose t g)
  condenseV :: t (Vessel k g) -> Vessel k (Compose t g)
condenseV t (Vessel k g)
col = DMap k (FlipAp g) -> t (Vessel k g) -> Vessel k (Compose t g)
forall (k :: ((* -> *) -> *) -> *) (t :: * -> *) (g :: * -> *).
(Has View k, GCompare k, Foldable t, Filterable t, Functor t) =>
DMap k (FlipAp g) -> t (Vessel k g) -> Vessel k (Compose t g)
condenseV' DMap k (FlipAp g)
folded t (Vessel k g)
col
    where folded :: DMap k (FlipAp g)
folded = t (DMap k (FlipAp g)) -> DMap k (FlipAp g)
forall (t :: * -> *) m. (Foldable t, Monoid m) => t m -> m
fold (t (DMap k (FlipAp g)) -> DMap k (FlipAp g))
-> t (DMap k (FlipAp g)) -> DMap k (FlipAp g)
forall a b. (a -> b) -> a -> b
$ (Vessel k g -> DMap k (FlipAp g))
-> t (Vessel k g) -> t (DMap k (FlipAp g))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (MonoidalDMap k (FlipAp g) -> DMap k (FlipAp g)
forall k (f :: k -> *) (g :: k -> *). MonoidalDMap f g -> DMap f g
unMonoidalDMap (MonoidalDMap k (FlipAp g) -> DMap k (FlipAp g))
-> (Vessel k g -> MonoidalDMap k (FlipAp g))
-> Vessel k g
-> DMap k (FlipAp g)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vessel k g -> MonoidalDMap k (FlipAp g)
forall (k :: ((* -> *) -> *) -> *) (g :: * -> *).
Vessel k g -> MonoidalDMap k (FlipAp g)
unVessel) t (Vessel k g)
col
  disperseV :: (Align t) => Vessel k (Compose t g) -> t (Vessel k g)
  disperseV :: Vessel k (Compose t g) -> t (Vessel k g)
disperseV Vessel k (Compose t g)
row = case DMap k (FlipAp (Compose t g)) -> PivotD k (FlipAp (Compose t g))
forall l (k :: l -> *) (g :: l -> *).
GCompare k =>
DMap k g -> PivotD k g
findPivotD (MonoidalDMap k (FlipAp (Compose t g))
-> DMap k (FlipAp (Compose t g))
forall k (f :: k -> *) (g :: k -> *). MonoidalDMap f g -> DMap f g
unMonoidalDMap (Vessel k (Compose t g) -> MonoidalDMap k (FlipAp (Compose t g))
forall (k :: ((* -> *) -> *) -> *) (g :: * -> *).
Vessel k g -> MonoidalDMap k (FlipAp g)
unVessel Vessel k (Compose t g)
row)) of
    PivotD k (FlipAp (Compose t g))
NoneD -> t (Vessel k g)
forall (f :: * -> *) a. Align f => f a
nil
    OneD k v
k (FlipAp v (Compose t g)
v) -> k v -> (View v => t (Vessel k g)) -> t (Vessel k g)
forall k (c :: k -> Constraint) (f :: k -> *) (a :: k) r.
Has c f =>
f a -> (c a => r) -> r
has @View k v
k ((View v => t (Vessel k g)) -> t (Vessel k g))
-> (View v => t (Vessel k g)) -> t (Vessel k g)
forall a b. (a -> b) -> a -> b
$ (v g -> Vessel k g) -> t (v g) -> t (Vessel k g)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (k v -> v g -> Vessel k g
forall (v :: (* -> *) -> *) (k :: ((* -> *) -> *) -> *)
       (g :: * -> *).
View v =>
k v -> v g -> Vessel k g
singletonV k v
k) (v (Compose t g) -> t (v g)
forall (v :: (* -> *) -> *) (t :: * -> *) (g :: * -> *).
(View v, Align t) =>
v (Compose t g) -> t (v g)
disperseV v (Compose t g)
v)
    SplitD k v
pivot DMap k (FlipAp (Compose t g))
_l DMap k (FlipAp (Compose t g))
_r -> (t (Vessel k g) -> t (Vessel k g) -> t (Vessel k g))
-> (t (Vessel k g), t (Vessel k g)) -> t (Vessel k g)
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry ((These (Vessel k g) (Vessel k g) -> Vessel k g)
-> t (Vessel k g) -> t (Vessel k g) -> t (Vessel k g)
forall (f :: * -> *) a b c.
Semialign f =>
(These a b -> c) -> f a -> f b -> f c
alignWith ((Vessel k g -> Vessel k g -> Vessel k g)
-> These (Vessel k g) (Vessel k g) -> Vessel k g
forall a. (a -> a -> a) -> These a a -> a
mergeThese Vessel k g -> Vessel k g -> Vessel k g
forall (k :: ((* -> *) -> *) -> *) (g :: * -> *).
GCompare k =>
Vessel k g -> Vessel k g -> Vessel k g
unionDistinctAscV)) ((t (Vessel k g), t (Vessel k g)) -> t (Vessel k g))
-> (t (Vessel k g), t (Vessel k g)) -> t (Vessel k g)
forall a b. (a -> b) -> a -> b
$
      Vessel k (Compose t g) -> t (Vessel k g)
forall (v :: (* -> *) -> *) (t :: * -> *) (g :: * -> *).
(View v, Align t) =>
v (Compose t g) -> t (v g)
disperseV (Vessel k (Compose t g) -> t (Vessel k g))
-> (Vessel k (Compose t g) -> t (Vessel k g))
-> (Vessel k (Compose t g), Vessel k (Compose t g))
-> (t (Vessel k g), t (Vessel k g))
forall (a :: * -> * -> *) b c b' c'.
Arrow a =>
a b c -> a b' c' -> a (b, b') (c, c')
*** Vessel k (Compose t g) -> t (Vessel k g)
forall (v :: (* -> *) -> *) (t :: * -> *) (g :: * -> *).
(View v, Align t) =>
v (Compose t g) -> t (v g)
disperseV ((Vessel k (Compose t g), Vessel k (Compose t g))
 -> (t (Vessel k g), t (Vessel k g)))
-> (Vessel k (Compose t g), Vessel k (Compose t g))
-> (t (Vessel k g), t (Vessel k g))
forall a b. (a -> b) -> a -> b
$ k v
-> (View v => (Vessel k (Compose t g), Vessel k (Compose t g)))
-> (Vessel k (Compose t g), Vessel k (Compose t g))
forall k (c :: k -> Constraint) (f :: k -> *) (a :: k) r.
Has c f =>
f a -> (c a => r) -> r
has @View k v
pivot ((View v => (Vessel k (Compose t g), Vessel k (Compose t g)))
 -> (Vessel k (Compose t g), Vessel k (Compose t g)))
-> (View v => (Vessel k (Compose t g), Vessel k (Compose t g)))
-> (Vessel k (Compose t g), Vessel k (Compose t g))
forall a b. (a -> b) -> a -> b
$ k v
-> Vessel k (Compose t g)
-> (Vessel k (Compose t g), Vessel k (Compose t g))
forall (k :: ((* -> *) -> *) -> *) (v :: (* -> *) -> *)
       (g :: * -> *).
(GCompare k, View v) =>
k v -> Vessel k g -> (Vessel k g, Vessel k g)
splitLTV k v
pivot Vessel k (Compose t g)
row
  mapMaybeV :: (forall a. f a -> Maybe (g a)) -> Vessel k f -> Maybe (Vessel k g)
mapMaybeV forall a. f a -> Maybe (g a)
f (Vessel (MonoidalDMap DMap k (FlipAp f)
m)) = Vessel k g -> Maybe (Vessel k g)
forall (v :: (* -> *) -> *) (f :: * -> *).
View v =>
v f -> Maybe (v f)
collapseNullV (Vessel k g -> Maybe (Vessel k g))
-> Vessel k g -> Maybe (Vessel k g)
forall a b. (a -> b) -> a -> b
$ MonoidalDMap k (FlipAp g) -> Vessel k g
forall (k :: ((* -> *) -> *) -> *) (g :: * -> *).
MonoidalDMap k (FlipAp g) -> Vessel k g
Vessel (MonoidalDMap k (FlipAp g) -> Vessel k g)
-> MonoidalDMap k (FlipAp g) -> Vessel k g
forall a b. (a -> b) -> a -> b
$ DMap k (FlipAp g) -> MonoidalDMap k (FlipAp g)
forall k (f :: k -> *) (g :: k -> *). DMap f g -> MonoidalDMap f g
MonoidalDMap (DMap k (FlipAp g) -> MonoidalDMap k (FlipAp g))
-> DMap k (FlipAp g) -> MonoidalDMap k (FlipAp g)
forall a b. (a -> b) -> a -> b
$
    (forall (v :: (* -> *) -> *).
 k v -> FlipAp f v -> Maybe (FlipAp g v))
-> DMap k (FlipAp f) -> DMap k (FlipAp g)
forall k1 (k2 :: k1 -> *) (f :: k1 -> *) (g :: k1 -> *).
GCompare k2 =>
(forall (v :: k1). k2 v -> f v -> Maybe (g v))
-> DMap k2 f -> DMap k2 g
DMap'.mapMaybeWithKey (\k v
k (FlipAp v) -> k v -> (View v => Maybe (FlipAp g v)) -> Maybe (FlipAp g v)
forall k (c :: k -> Constraint) (f :: k -> *) (a :: k) r.
Has c f =>
f a -> (c a => r) -> r
has @View k v
k ((View v => Maybe (FlipAp g v)) -> Maybe (FlipAp g v))
-> (View v => Maybe (FlipAp g v)) -> Maybe (FlipAp g v)
forall a b. (a -> b) -> a -> b
$ v g -> FlipAp g v
forall k (g :: k) (v :: k -> *). v g -> FlipAp g v
FlipAp (v g -> FlipAp g v) -> Maybe (v g) -> Maybe (FlipAp g v)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (forall a. f a -> Maybe (g a)) -> v f -> Maybe (v g)
forall (v :: (* -> *) -> *) (f :: * -> *) (g :: * -> *).
View v =>
(forall a. f a -> Maybe (g a)) -> v f -> Maybe (v g)
mapMaybeV forall a. f a -> Maybe (g a)
f v f
v) DMap k (FlipAp f)
m
  alignWithMaybeV :: (forall a. These (f a) (g a) -> Maybe (h a))
-> Vessel k f -> Vessel k g -> Maybe (Vessel k h)
alignWithMaybeV (f :: forall a. These (f a) (g a) -> Maybe (h a)) (Vessel MonoidalDMap k (FlipAp f)
as) (Vessel MonoidalDMap k (FlipAp g)
bs) = Vessel k h -> Maybe (Vessel k h)
forall (v :: (* -> *) -> *) (f :: * -> *).
View v =>
v f -> Maybe (v f)
collapseNullV (Vessel k h -> Maybe (Vessel k h))
-> Vessel k h -> Maybe (Vessel k h)
forall a b. (a -> b) -> a -> b
$ MonoidalDMap k (FlipAp h) -> Vessel k h
forall (k :: ((* -> *) -> *) -> *) (g :: * -> *).
MonoidalDMap k (FlipAp g) -> Vessel k g
Vessel (MonoidalDMap k (FlipAp h) -> Vessel k h)
-> MonoidalDMap k (FlipAp h) -> Vessel k h
forall a b. (a -> b) -> a -> b
$
    let g :: forall v. k v -> These (FlipAp f v) (FlipAp g v) -> Maybe (FlipAp h v)
        g :: k v -> These (FlipAp f v) (FlipAp g v) -> Maybe (FlipAp h v)
g k v
k = k v
-> (View v =>
    These (FlipAp f v) (FlipAp g v) -> Maybe (FlipAp h v))
-> These (FlipAp f v) (FlipAp g v)
-> Maybe (FlipAp h v)
forall k (c :: k -> Constraint) (f :: k -> *) (a :: k) r.
Has c f =>
f a -> (c a => r) -> r
has @View k v
k ((View v => These (FlipAp f v) (FlipAp g v) -> Maybe (FlipAp h v))
 -> These (FlipAp f v) (FlipAp g v) -> Maybe (FlipAp h v))
-> (View v =>
    These (FlipAp f v) (FlipAp g v) -> Maybe (FlipAp h v))
-> These (FlipAp f v) (FlipAp g v)
-> Maybe (FlipAp h v)
forall a b. (a -> b) -> a -> b
$ (v h -> FlipAp h v) -> Maybe (v h) -> Maybe (FlipAp h v)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap v h -> FlipAp h v
forall k (g :: k) (v :: k -> *). v g -> FlipAp g v
FlipAp (Maybe (v h) -> Maybe (FlipAp h v))
-> (These (FlipAp f v) (FlipAp g v) -> Maybe (v h))
-> These (FlipAp f v) (FlipAp g v)
-> Maybe (FlipAp h v)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. \case
          This (FlipAp v f
a) -> (forall a. f a -> Maybe (h a)) -> v f -> Maybe (v h)
forall (v :: (* -> *) -> *) (f :: * -> *) (g :: * -> *).
View v =>
(forall a. f a -> Maybe (g a)) -> v f -> Maybe (v g)
mapMaybeV (These (f a) (g a) -> Maybe (h a)
forall a. These (f a) (g a) -> Maybe (h a)
f (These (f a) (g a) -> Maybe (h a))
-> (f a -> These (f a) (g a)) -> f a -> Maybe (h a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. f a -> These (f a) (g a)
forall a b. a -> These a b
This) v f
a
          That (FlipAp v g
b) -> (forall a. g a -> Maybe (h a)) -> v g -> Maybe (v h)
forall (v :: (* -> *) -> *) (f :: * -> *) (g :: * -> *).
View v =>
(forall a. f a -> Maybe (g a)) -> v f -> Maybe (v g)
mapMaybeV (These (f a) (g a) -> Maybe (h a)
forall a. These (f a) (g a) -> Maybe (h a)
f (These (f a) (g a) -> Maybe (h a))
-> (g a -> These (f a) (g a)) -> g a -> Maybe (h a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. g a -> These (f a) (g a)
forall a b. b -> These a b
That) v g
b
          These (FlipAp v f
a) (FlipAp v g
b) -> (forall a. These (f a) (g a) -> Maybe (h a))
-> v f -> v g -> Maybe (v h)
forall (v :: (* -> *) -> *) (f :: * -> *) (g :: * -> *)
       (h :: * -> *).
View v =>
(forall a. These (f a) (g a) -> Maybe (h a))
-> v f -> v g -> Maybe (v h)
alignWithMaybeV forall a. These (f a) (g a) -> Maybe (h a)
f v f
a v g
b
    in (forall (a :: (* -> *) -> *).
 k a -> These (FlipAp f a) (FlipAp g a) -> Maybe (FlipAp h a))
-> MonoidalDMap k (FlipAp f)
-> MonoidalDMap k (FlipAp g)
-> MonoidalDMap k (FlipAp h)
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 forall (a :: (* -> *) -> *).
k a -> These (FlipAp f a) (FlipAp g a) -> Maybe (FlipAp h a)
g MonoidalDMap k (FlipAp f)
as MonoidalDMap k (FlipAp g)
bs
  alignWithV :: (forall a. These (f a) (g a) -> h a)
-> Vessel k f -> Vessel k g -> Vessel k h
alignWithV (f :: forall a. These (f a) (g a) -> h a) (Vessel MonoidalDMap k (FlipAp f)
as) (Vessel MonoidalDMap k (FlipAp g)
bs) = MonoidalDMap k (FlipAp h) -> Vessel k h
forall (k :: ((* -> *) -> *) -> *) (g :: * -> *).
MonoidalDMap k (FlipAp g) -> Vessel k g
Vessel (MonoidalDMap k (FlipAp h) -> Vessel k h)
-> MonoidalDMap k (FlipAp h) -> Vessel k h
forall a b. (a -> b) -> a -> b
$
    let g :: forall v. k v -> These (FlipAp f v) (FlipAp g v) -> FlipAp h v
        g :: k v -> These (FlipAp f v) (FlipAp g v) -> FlipAp h v
g k v
k = k v
-> (View v => These (FlipAp f v) (FlipAp g v) -> FlipAp h v)
-> These (FlipAp f v) (FlipAp g v)
-> FlipAp h v
forall k (c :: k -> Constraint) (f :: k -> *) (a :: k) r.
Has c f =>
f a -> (c a => r) -> r
has @View k v
k ((View v => These (FlipAp f v) (FlipAp g v) -> FlipAp h v)
 -> These (FlipAp f v) (FlipAp g v) -> FlipAp h v)
-> (View v => These (FlipAp f v) (FlipAp g v) -> FlipAp h v)
-> These (FlipAp f v) (FlipAp g v)
-> FlipAp h v
forall a b. (a -> b) -> a -> b
$ v h -> FlipAp h v
forall k (g :: k) (v :: k -> *). v g -> FlipAp g v
FlipAp (v h -> FlipAp h v)
-> (These (FlipAp f v) (FlipAp g v) -> v h)
-> These (FlipAp f v) (FlipAp g v)
-> FlipAp h v
forall b c a. (b -> c) -> (a -> b) -> a -> c
. \case
          This (FlipAp v f
a) -> (forall a. f a -> h a) -> v f -> v h
forall (v :: (* -> *) -> *) (f :: * -> *) (g :: * -> *).
View v =>
(forall a. f a -> g a) -> v f -> v g
mapV (These (f a) (g a) -> h a
forall a. These (f a) (g a) -> h a
f (These (f a) (g a) -> h a)
-> (f a -> These (f a) (g a)) -> f a -> h a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. f a -> These (f a) (g a)
forall a b. a -> These a b
This) v f
a
          That (FlipAp v g
b) -> (forall a. g a -> h a) -> v g -> v h
forall (v :: (* -> *) -> *) (f :: * -> *) (g :: * -> *).
View v =>
(forall a. f a -> g a) -> v f -> v g
mapV (These (f a) (g a) -> h a
forall a. These (f a) (g a) -> h a
f (These (f a) (g a) -> h a)
-> (g a -> These (f a) (g a)) -> g a -> h a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. g a -> These (f a) (g a)
forall a b. b -> These a b
That) v g
b
          These (FlipAp v f
a) (FlipAp v g
b) -> (forall a. These (f a) (g a) -> h a) -> v f -> v g -> v h
forall (v :: (* -> *) -> *) (f :: * -> *) (g :: * -> *)
       (h :: * -> *).
View v =>
(forall a. These (f a) (g a) -> h a) -> v f -> v g -> v h
alignWithV forall a. These (f a) (g a) -> h a
f v f
a v g
b
    in (forall (a :: (* -> *) -> *).
 k a -> These (FlipAp f a) (FlipAp g a) -> FlipAp h a)
-> MonoidalDMap k (FlipAp f)
-> MonoidalDMap k (FlipAp g)
-> MonoidalDMap k (FlipAp h)
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 forall (a :: (* -> *) -> *).
k a -> These (FlipAp f a) (FlipAp g a) -> FlipAp h a
g MonoidalDMap k (FlipAp f)
as MonoidalDMap k (FlipAp g)
bs

instance (Has View k, GCompare k) => EmptyView (Vessel k) where
  emptyV :: Vessel k f
emptyV = MonoidalDMap k (FlipAp f) -> Vessel k f
forall (k :: ((* -> *) -> *) -> *) (g :: * -> *).
MonoidalDMap k (FlipAp g) -> Vessel k g
Vessel MonoidalDMap k (FlipAp f)
forall k1 (k2 :: k1 -> *) (f :: k1 -> *). MonoidalDMap k2 f
DMap.empty

toListV :: Vessel k g -> [VSum k g]
toListV :: Vessel k g -> [VSum k g]
toListV (Vessel MonoidalDMap k (FlipAp g)
m) = (DSum k (FlipAp g) -> VSum k g)
-> [DSum k (FlipAp g)] -> [VSum k g]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\(k a
k :=> FlipAp v) -> k a
k k a -> a g -> VSum k g
forall (k :: ((* -> *) -> *) -> *) (g :: * -> *)
       (v :: (* -> *) -> *).
k v -> v g -> VSum k g
:~> a g
v) (MonoidalDMap k (FlipAp g) -> [DSum k (FlipAp g)]
forall k1 (k2 :: k1 -> *) (f :: k1 -> *).
MonoidalDMap k2 f -> [DSum k2 f]
DMap.toList MonoidalDMap k (FlipAp g)
m)

fromListV :: (GCompare k, Has View k) => [VSum k g] -> Vessel k g
fromListV :: [VSum k g] -> Vessel k g
fromListV [VSum k g]
vs = MonoidalDMap k (FlipAp g) -> Vessel k g
forall (k :: ((* -> *) -> *) -> *) (g :: * -> *).
MonoidalDMap k (FlipAp g) -> Vessel k g
Vessel (MonoidalDMap k (FlipAp g) -> Vessel k g)
-> MonoidalDMap k (FlipAp g) -> Vessel k g
forall a b. (a -> b) -> a -> b
$
  (forall (v :: (* -> *) -> *).
 k v -> FlipAp g v -> FlipAp g v -> FlipAp g v)
-> [DSum k (FlipAp g)] -> MonoidalDMap k (FlipAp g)
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
_ FlipAp g v
_ FlipAp g v
v -> FlipAp g v
v) ([DSum k (FlipAp g)] -> MonoidalDMap k (FlipAp g))
-> [DSum k (FlipAp g)] -> MonoidalDMap k (FlipAp g)
forall a b. (a -> b) -> a -> b
$
  (VSum k g -> Maybe (DSum k (FlipAp g)))
-> [VSum k g] -> [DSum k (FlipAp g)]
forall (f :: * -> *) a b.
Filterable f =>
(a -> Maybe b) -> f a -> f b
mapMaybe (\(k v
k :~> v g
v) -> k v
-> (View v => Maybe (DSum k (FlipAp g)))
-> Maybe (DSum k (FlipAp g))
forall k (c :: k -> Constraint) (f :: k -> *) (a :: k) r.
Has c f =>
f a -> (c a => r) -> r
has @View k v
k ((View v => Maybe (DSum k (FlipAp g)))
 -> Maybe (DSum k (FlipAp g)))
-> (View v => Maybe (DSum k (FlipAp g)))
-> Maybe (DSum k (FlipAp g))
forall a b. (a -> b) -> a -> b
$ if v g -> Bool
forall (v :: (* -> *) -> *) (i :: * -> *). View v => v i -> Bool
nullV v g
v then Maybe (DSum k (FlipAp g))
forall a. Maybe a
Nothing else DSum k (FlipAp g) -> Maybe (DSum k (FlipAp g))
forall a. a -> Maybe a
Just (DSum k (FlipAp g) -> Maybe (DSum k (FlipAp g)))
-> DSum k (FlipAp g) -> Maybe (DSum k (FlipAp g))
forall a b. (a -> b) -> a -> b
$ k v
k k v -> FlipAp g v -> DSum k (FlipAp g)
forall k (tag :: k -> *) (f :: k -> *) (a :: k).
tag a -> f a -> DSum tag f
:=> v g -> FlipAp g v
forall k (g :: k) (v :: k -> *). v g -> FlipAp g v
FlipAp v g
v) [VSum k g]
vs

intersectionMaybeWithKeyV :: (GCompare k, Has View k) => (forall v. View v => k v -> v g -> v g' -> Maybe (v h)) -> Vessel k g -> Vessel k g' -> Vessel k h
intersectionMaybeWithKeyV :: (forall (v :: (* -> *) -> *).
 View v =>
 k v -> v g -> v g' -> Maybe (v h))
-> Vessel k g -> Vessel k g' -> Vessel k h
intersectionMaybeWithKeyV forall (v :: (* -> *) -> *).
View v =>
k v -> v g -> v g' -> Maybe (v h)
f (Vessel MonoidalDMap k (FlipAp g)
m) (Vessel MonoidalDMap k (FlipAp g')
m') = MonoidalDMap k (FlipAp h) -> Vessel k h
forall (k :: ((* -> *) -> *) -> *) (g :: * -> *).
MonoidalDMap k (FlipAp g) -> Vessel k g
Vessel (MonoidalDMap k (FlipAp h) -> Vessel k h)
-> MonoidalDMap k (FlipAp h) -> Vessel k h
forall a b. (a -> b) -> a -> b
$
  MonoidalDMap k (FlipAp h) -> MonoidalDMap k (FlipAp h)
forall (k :: ((* -> *) -> *) -> *) (f :: * -> *).
(GCompare k, Has View k) =>
MonoidalDMap k (FlipAp f) -> MonoidalDMap k (FlipAp f)
filterNullFlipAps (MonoidalDMap k (FlipAp h) -> MonoidalDMap k (FlipAp h))
-> MonoidalDMap k (FlipAp h) -> MonoidalDMap k (FlipAp h)
forall a b. (a -> b) -> a -> b
$
  (forall (x :: (* -> *) -> *).
 k x -> FlipAp g x -> FlipAp g' x -> Maybe (FlipAp h x))
-> MonoidalDMap k (FlipAp g)
-> MonoidalDMap k (FlipAp g')
-> MonoidalDMap k (FlipAp h)
forall k (k :: k -> *) (a :: k -> *) (b :: k -> *) (c :: k -> *).
GCompare k =>
(forall (x :: k). k x -> a x -> b x -> Maybe (c x))
-> MonoidalDMap k a -> MonoidalDMap k b -> MonoidalDMap k c
intersectionDMapMaybeWithKey (\k x
k (FlipAp x) (FlipAp y) -> k x -> (View x => Maybe (FlipAp h x)) -> Maybe (FlipAp h x)
forall k (c :: k -> Constraint) (f :: k -> *) (a :: k) r.
Has c f =>
f a -> (c a => r) -> r
has @View k x
k ((View x => Maybe (FlipAp h x)) -> Maybe (FlipAp h x))
-> (View x => Maybe (FlipAp h x)) -> Maybe (FlipAp h x)
forall a b. (a -> b) -> a -> b
$ x h -> FlipAp h x
forall k (g :: k) (v :: k -> *). v g -> FlipAp g v
FlipAp (x h -> FlipAp h x) -> Maybe (x h) -> Maybe (FlipAp h x)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> k x -> x g -> x g' -> Maybe (x h)
forall (v :: (* -> *) -> *).
View v =>
k v -> v g -> v g' -> Maybe (v h)
f k x
k x g
x x g'
y) MonoidalDMap k (FlipAp g)
m MonoidalDMap k (FlipAp g')
m'

traverseWithKeyV :: (GCompare k, Has View k, Applicative m) => (forall v. View v => k v -> v g -> m (v h)) -> Vessel k g -> m (Vessel k h)
traverseWithKeyV :: (forall (v :: (* -> *) -> *). View v => k v -> v g -> m (v h))
-> Vessel k g -> m (Vessel k h)
traverseWithKeyV forall (v :: (* -> *) -> *). View v => k v -> v g -> m (v h)
f (Vessel MonoidalDMap k (FlipAp g)
x) = MonoidalDMap k (FlipAp h) -> Vessel k h
forall (k :: ((* -> *) -> *) -> *) (g :: * -> *).
MonoidalDMap k (FlipAp g) -> Vessel k g
Vessel (MonoidalDMap k (FlipAp h) -> Vessel k h)
-> (MonoidalDMap k (FlipAp h) -> MonoidalDMap k (FlipAp h))
-> MonoidalDMap k (FlipAp h)
-> Vessel k h
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MonoidalDMap k (FlipAp h) -> MonoidalDMap k (FlipAp h)
forall (k :: ((* -> *) -> *) -> *) (f :: * -> *).
(GCompare k, Has View k) =>
MonoidalDMap k (FlipAp f) -> MonoidalDMap k (FlipAp f)
filterNullFlipAps (MonoidalDMap k (FlipAp h) -> Vessel k h)
-> m (MonoidalDMap k (FlipAp h)) -> m (Vessel k h)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (forall (v :: (* -> *) -> *). k v -> FlipAp g v -> m (FlipAp h v))
-> MonoidalDMap k (FlipAp g) -> m (MonoidalDMap k (FlipAp h))
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
k (FlipAp v) -> k v -> (View v => m (FlipAp h v)) -> m (FlipAp h v)
forall k (c :: k -> Constraint) (f :: k -> *) (a :: k) r.
Has c f =>
f a -> (c a => r) -> r
has @View k v
k ((View v => m (FlipAp h v)) -> m (FlipAp h v))
-> (View v => m (FlipAp h v)) -> m (FlipAp h v)
forall a b. (a -> b) -> a -> b
$ v h -> FlipAp h v
forall k (g :: k) (v :: k -> *). v g -> FlipAp g v
FlipAp (v h -> FlipAp h v) -> m (v h) -> m (FlipAp h v)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> k v -> v g -> m (v h)
forall (v :: (* -> *) -> *). View v => k v -> v g -> m (v h)
f k v
k v g
v) MonoidalDMap k (FlipAp g)
x

traverseWithKeyV_ :: (GCompare k, Has View k, Applicative m) => (forall v. View v => k v -> v g -> m ()) -> Vessel k g -> m ()
traverseWithKeyV_ :: (forall (v :: (* -> *) -> *). View v => k v -> v g -> m ())
-> Vessel k g -> m ()
traverseWithKeyV_ forall (v :: (* -> *) -> *). View v => k v -> v g -> m ()
f (Vessel MonoidalDMap k (FlipAp g)
x) = m (MonoidalDMap k (Const ())) -> m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (m (MonoidalDMap k (Const ())) -> m ())
-> m (MonoidalDMap k (Const ())) -> m ()
forall a b. (a -> b) -> a -> b
$ (forall (v :: (* -> *) -> *). k v -> FlipAp g v -> m (Const () v))
-> MonoidalDMap k (FlipAp g) -> m (MonoidalDMap k (Const ()))
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
k (FlipAp v) -> k v -> (View v => m (Const () v)) -> m (Const () v)
forall k (c :: k -> Constraint) (f :: k -> *) (a :: k) r.
Has c f =>
f a -> (c a => r) -> r
has @View k v
k ((View v => m (Const () v)) -> m (Const () v))
-> (View v => m (Const () v)) -> m (Const () v)
forall a b. (a -> b) -> a -> b
$ () -> Const () v
forall k a (b :: k). a -> Const a b
Const () Const () v -> m () -> m (Const () v)
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ k v -> v g -> m ()
forall (v :: (* -> *) -> *). View v => k v -> v g -> m ()
f k v
k v g
v) MonoidalDMap k (FlipAp g)
x

buildV :: (GCompare k, Has View k, Applicative m) => Vessel k g -> (forall v. k v -> v g -> m (v h)) -> m (Vessel k h)
buildV :: Vessel k g
-> (forall (v :: (* -> *) -> *). k v -> v g -> m (v h))
-> m (Vessel k h)
buildV Vessel k g
v forall (v :: (* -> *) -> *). k v -> v g -> m (v h)
f = (forall (v :: (* -> *) -> *). View v => k v -> v g -> m (v h))
-> Vessel k g -> m (Vessel k h)
forall (k :: ((* -> *) -> *) -> *) (m :: * -> *) (g :: * -> *)
       (h :: * -> *).
(GCompare k, Has View k, Applicative m) =>
(forall (v :: (* -> *) -> *). View v => k v -> v g -> m (v h))
-> Vessel k g -> m (Vessel k h)
traverseWithKeyV forall (v :: (* -> *) -> *). k v -> v g -> m (v h)
forall (v :: (* -> *) -> *). View v => k v -> v g -> m (v h)
f Vessel k g
v

intersectionWithKeyV :: (GCompare k, Has View k) => (forall v. View v => k v -> v g -> v g' -> v h) -> Vessel k g -> Vessel k g' -> Vessel k h
intersectionWithKeyV :: (forall (v :: (* -> *) -> *). View v => k v -> v g -> v g' -> v h)
-> Vessel k g -> Vessel k g' -> Vessel k h
intersectionWithKeyV forall (v :: (* -> *) -> *). View v => k v -> v g -> v g' -> v h
f (Vessel MonoidalDMap k (FlipAp g)
m) (Vessel MonoidalDMap k (FlipAp g')
m') = MonoidalDMap k (FlipAp h) -> Vessel k h
forall (k :: ((* -> *) -> *) -> *) (g :: * -> *).
MonoidalDMap k (FlipAp g) -> Vessel k g
Vessel (MonoidalDMap k (FlipAp h) -> Vessel k h)
-> MonoidalDMap k (FlipAp h) -> Vessel k h
forall a b. (a -> b) -> a -> b
$
  MonoidalDMap k (FlipAp h) -> MonoidalDMap k (FlipAp h)
forall (k :: ((* -> *) -> *) -> *) (f :: * -> *).
(GCompare k, Has View k) =>
MonoidalDMap k (FlipAp f) -> MonoidalDMap k (FlipAp f)
filterNullFlipAps (MonoidalDMap k (FlipAp h) -> MonoidalDMap k (FlipAp h))
-> MonoidalDMap k (FlipAp h) -> MonoidalDMap k (FlipAp h)
forall a b. (a -> b) -> a -> b
$
  (forall (v :: (* -> *) -> *).
 k v -> FlipAp g v -> FlipAp g' v -> FlipAp h v)
-> MonoidalDMap k (FlipAp g)
-> MonoidalDMap k (FlipAp g')
-> MonoidalDMap k (FlipAp h)
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
k (FlipAp x) (FlipAp y) -> k v -> (View v => FlipAp h v) -> FlipAp h v
forall k (c :: k -> Constraint) (f :: k -> *) (a :: k) r.
Has c f =>
f a -> (c a => r) -> r
has @View k v
k ((View v => FlipAp h v) -> FlipAp h v)
-> (View v => FlipAp h v) -> FlipAp h v
forall a b. (a -> b) -> a -> b
$ v h -> FlipAp h v
forall k (g :: k) (v :: k -> *). v g -> FlipAp g v
FlipAp (k v -> v g -> v g' -> v h
forall (v :: (* -> *) -> *). View v => k v -> v g -> v g' -> v h
f k v
k v g
x v g'
y)) MonoidalDMap k (FlipAp g)
m MonoidalDMap k (FlipAp g')
m'

------- Operations on Vessel -------

singletonV :: View v => k v -> v g -> Vessel k g
singletonV :: k v -> v g -> Vessel k g
singletonV k v
k v g
v = MonoidalDMap k (FlipAp g) -> Vessel k g
forall (k :: ((* -> *) -> *) -> *) (g :: * -> *).
MonoidalDMap k (FlipAp g) -> Vessel k g
Vessel (MonoidalDMap k (FlipAp g) -> Vessel k g)
-> MonoidalDMap k (FlipAp g) -> Vessel k g
forall a b. (a -> b) -> a -> b
$ if v g -> Bool
forall (v :: (* -> *) -> *) (i :: * -> *). View v => v i -> Bool
nullV v g
v then MonoidalDMap k (FlipAp g)
forall k1 (k2 :: k1 -> *) (f :: k1 -> *). MonoidalDMap k2 f
DMap.empty else k v -> FlipAp g v -> MonoidalDMap k (FlipAp g)
forall k1 (k2 :: k1 -> *) (v :: k1) (f :: k1 -> *).
k2 v -> f v -> MonoidalDMap k2 f
DMap.singleton k v
k (v g -> FlipAp g v
forall k (g :: k) (v :: k -> *). v g -> FlipAp g v
FlipAp v g
v)

lookupV :: (GCompare k) => k v -> Vessel k g -> Maybe (v g)
lookupV :: k v -> Vessel k g -> Maybe (v g)
lookupV k v
k (Vessel MonoidalDMap k (FlipAp g)
m) = FlipAp g v -> v g
forall k (g :: k) (v :: k -> *). FlipAp g v -> v g
unFlipAp (FlipAp g v -> v g) -> Maybe (FlipAp g v) -> Maybe (v g)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> k v -> MonoidalDMap k (FlipAp g) -> Maybe (FlipAp g v)
forall k1 (k2 :: k1 -> *) (f :: k1 -> *) (v :: k1).
GCompare k2 =>
k2 v -> MonoidalDMap k2 f -> Maybe (f v)
DMap.lookup k v
k MonoidalDMap k (FlipAp g)
m

mapMaybeWithKeyV :: (GCompare k, Has View k) => (forall v. View v => k v -> v g -> Maybe (v g')) -> Vessel k g -> Vessel k g'
mapMaybeWithKeyV :: (forall (v :: (* -> *) -> *). View v => k v -> v g -> Maybe (v g'))
-> Vessel k g -> Vessel k g'
mapMaybeWithKeyV forall (v :: (* -> *) -> *). View v => k v -> v g -> Maybe (v g')
f (Vessel MonoidalDMap k (FlipAp g)
m) = MonoidalDMap k (FlipAp g') -> Vessel k g'
forall (k :: ((* -> *) -> *) -> *) (g :: * -> *).
MonoidalDMap k (FlipAp g) -> Vessel k g
Vessel (MonoidalDMap k (FlipAp g') -> Vessel k g')
-> MonoidalDMap k (FlipAp g') -> Vessel k g'
forall a b. (a -> b) -> a -> b
$ (forall (v :: (* -> *) -> *).
 k v -> FlipAp g v -> Maybe (FlipAp g' v))
-> MonoidalDMap k (FlipAp g) -> MonoidalDMap k (FlipAp g')
forall k1 (k2 :: k1 -> *) (f :: k1 -> *) (g :: k1 -> *).
GCompare k2 =>
(forall (v :: k1). k2 v -> f v -> Maybe (g v))
-> MonoidalDMap k2 f -> MonoidalDMap k2 g
DMap.mapMaybeWithKey (\k v
k (FlipAp x) -> k v -> (View v => Maybe (FlipAp g' v)) -> Maybe (FlipAp g' v)
forall k (c :: k -> Constraint) (f :: k -> *) (a :: k) r.
Has c f =>
f a -> (c a => r) -> r
has @View k v
k ((View v => Maybe (FlipAp g' v)) -> Maybe (FlipAp g' v))
-> (View v => Maybe (FlipAp g' v)) -> Maybe (FlipAp g' v)
forall a b. (a -> b) -> a -> b
$ v g' -> FlipAp g' v
forall k (g :: k) (v :: k -> *). v g -> FlipAp g v
FlipAp (v g' -> FlipAp g' v) -> Maybe (v g') -> Maybe (FlipAp g' v)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (v g' -> Maybe (v g')
forall (v :: (* -> *) -> *) (f :: * -> *).
View v =>
v f -> Maybe (v f)
collapseNullV (v g' -> Maybe (v g')) -> Maybe (v g') -> Maybe (v g')
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< k v -> v g -> Maybe (v g')
forall (v :: (* -> *) -> *). View v => k v -> v g -> Maybe (v g')
f k v
k v g
x)) MonoidalDMap k (FlipAp g)
m

--TODO: Upstream
intersectionDMapMaybeWithKey :: GCompare k => (forall x. k x -> a x -> b x -> Maybe (c x)) -> MonoidalDMap k a -> MonoidalDMap k b -> MonoidalDMap k c
intersectionDMapMaybeWithKey :: (forall (x :: k). k x -> a x -> b x -> Maybe (c x))
-> MonoidalDMap k a -> MonoidalDMap k b -> MonoidalDMap k c
intersectionDMapMaybeWithKey forall (x :: k). k x -> a x -> b x -> Maybe (c x)
f MonoidalDMap k a
a MonoidalDMap k b
b = (forall (v :: k). k v -> Compose Maybe c v -> Maybe (c v))
-> MonoidalDMap k (Compose Maybe c) -> MonoidalDMap k c
forall k1 (k2 :: k1 -> *) (f :: k1 -> *) (g :: k1 -> *).
GCompare k2 =>
(forall (v :: k1). k2 v -> f v -> Maybe (g v))
-> MonoidalDMap k2 f -> MonoidalDMap k2 g
DMap.mapMaybeWithKey (\k v
_ -> Compose Maybe c v -> Maybe (c v)
forall k1 (f :: k1 -> *) k2 (g :: k2 -> k1) (a :: k2).
Compose f g a -> f (g a)
getCompose) (MonoidalDMap k (Compose Maybe c) -> MonoidalDMap k c)
-> MonoidalDMap k (Compose Maybe c) -> MonoidalDMap k c
forall a b. (a -> b) -> a -> b
$ (forall (v :: k). k v -> a v -> b v -> Compose Maybe c v)
-> MonoidalDMap k a
-> MonoidalDMap k b
-> MonoidalDMap k (Compose Maybe c)
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
k a v
x b v
y -> Maybe (c v) -> Compose Maybe c v
forall k k1 (f :: k -> *) (g :: k1 -> k) (a :: k1).
f (g a) -> Compose f g a
Compose (Maybe (c v) -> Compose Maybe c v)
-> Maybe (c v) -> Compose Maybe c v
forall a b. (a -> b) -> a -> b
$ k v -> a v -> b v -> Maybe (c v)
forall (x :: k). k x -> a x -> b x -> Maybe (c x)
f k v
k a v
x b v
y) MonoidalDMap k a
a MonoidalDMap k b
b

------- Instances for Vessel -------
condenseV' :: forall k t g.
              ( Has View k, GCompare k, Foldable t, Filterable t, Functor t)
           => DMap k (FlipAp g)
           -> t (Vessel k g)
           -> Vessel k (Compose t g)
condenseV' :: DMap k (FlipAp g) -> t (Vessel k g) -> Vessel k (Compose t g)
condenseV' DMap k (FlipAp g)
folded t (Vessel k g)
col =
  case DMap k (FlipAp g) -> PivotD k (FlipAp g)
forall l (k :: l -> *) (g :: l -> *).
GCompare k =>
DMap k g -> PivotD k g
findPivotD DMap k (FlipAp g)
folded of
    PivotD k (FlipAp g)
NoneD -> Vessel k (Compose t g)
forall (v :: (* -> *) -> *) (f :: * -> *). EmptyView v => v f
emptyV
    OneD (k v
k :: k v) FlipAp g v
_ -> k v -> (View v => Vessel k (Compose t g)) -> Vessel k (Compose t g)
forall k (c :: k -> Constraint) (f :: k -> *) (a :: k) r.
Has c f =>
f a -> (c a => r) -> r
has @View k v
k ((View v => Vessel k (Compose t g)) -> Vessel k (Compose t g))
-> (View v => Vessel k (Compose t g)) -> Vessel k (Compose t g)
forall a b. (a -> b) -> a -> b
$ k v -> v (Compose t g) -> Vessel k (Compose t g)
forall (v :: (* -> *) -> *) (k :: ((* -> *) -> *) -> *)
       (g :: * -> *).
View v =>
k v -> v g -> Vessel k g
singletonV k v
k (t (v g) -> v (Compose t g)
forall (v :: (* -> *) -> *) (t :: * -> *) (g :: * -> *).
(View v, Foldable t, Filterable t, Functor t) =>
t (v g) -> v (Compose t g)
condenseV (t (v g) -> v (Compose t g)) -> t (v g) -> v (Compose t g)
forall a b. (a -> b) -> a -> b
$ (Vessel k g -> Maybe (v g)) -> t (Vessel k g) -> t (v g)
forall (f :: * -> *) a b.
Filterable f =>
(a -> Maybe b) -> f a -> f b
mapMaybe (k v -> Vessel k g -> Maybe (v g)
forall (k :: ((* -> *) -> *) -> *) (v :: (* -> *) -> *)
       (g :: * -> *).
GCompare k =>
k v -> Vessel k g -> Maybe (v g)
lookupV k v
k) t (Vessel k g)
col)
    SplitD k v
pivot DMap k (FlipAp g)
l DMap k (FlipAp g)
r -> (Vessel k (Compose t g)
 -> Vessel k (Compose t g) -> Vessel k (Compose t g))
-> (Vessel k (Compose t g), Vessel k (Compose t g))
-> Vessel k (Compose t g)
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Vessel k (Compose t g)
-> Vessel k (Compose t g) -> Vessel k (Compose t g)
forall (k :: ((* -> *) -> *) -> *) (g :: * -> *).
GCompare k =>
Vessel k g -> Vessel k g -> Vessel k g
unionDistinctAscV ((Vessel k (Compose t g), Vessel k (Compose t g))
 -> Vessel k (Compose t g))
-> (Vessel k (Compose t g), Vessel k (Compose t g))
-> Vessel k (Compose t g)
forall a b. (a -> b) -> a -> b
$ (DMap k (FlipAp g) -> t (Vessel k g) -> Vessel k (Compose t g)
forall (k :: ((* -> *) -> *) -> *) (t :: * -> *) (g :: * -> *).
(Has View k, GCompare k, Foldable t, Filterable t, Functor t) =>
DMap k (FlipAp g) -> t (Vessel k g) -> Vessel k (Compose t g)
condenseV' DMap k (FlipAp g)
l (t (Vessel k g) -> Vessel k (Compose t g))
-> (t (Vessel k g) -> Vessel k (Compose t g))
-> (t (Vessel k g), t (Vessel k g))
-> (Vessel k (Compose t g), Vessel k (Compose t g))
forall (a :: * -> * -> *) b c b' c'.
Arrow a =>
a b c -> a b' c' -> a (b, b') (c, c')
*** DMap k (FlipAp g) -> t (Vessel k g) -> Vessel k (Compose t g)
forall (k :: ((* -> *) -> *) -> *) (t :: * -> *) (g :: * -> *).
(Has View k, GCompare k, Foldable t, Filterable t, Functor t) =>
DMap k (FlipAp g) -> t (Vessel k g) -> Vessel k (Compose t g)
condenseV' DMap k (FlipAp g)
r) ((t (Vessel k g), t (Vessel k g))
 -> (Vessel k (Compose t g), Vessel k (Compose t g)))
-> (t (Vessel k g), t (Vessel k g))
-> (Vessel k (Compose t g), Vessel k (Compose t g))
forall a b. (a -> b) -> a -> b
$ k v
-> (View v => (t (Vessel k g), t (Vessel k g)))
-> (t (Vessel k g), t (Vessel k g))
forall k (c :: k -> Constraint) (f :: k -> *) (a :: k) r.
Has c f =>
f a -> (c a => r) -> r
has @View k v
pivot ((View v => (t (Vessel k g), t (Vessel k g)))
 -> (t (Vessel k g), t (Vessel k g)))
-> (View v => (t (Vessel k g), t (Vessel k g)))
-> (t (Vessel k g), t (Vessel k g))
forall a b. (a -> b) -> a -> b
$ k v -> t (Vessel k g) -> (t (Vessel k g), t (Vessel k g))
forall (k :: ((* -> *) -> *) -> *) (t :: * -> *) (g :: * -> *)
       (v :: (* -> *) -> *).
(GCompare k, View v, Filterable t) =>
k v -> t (Vessel k g) -> (t (Vessel k g), t (Vessel k g))
splitV k v
pivot t (Vessel k g)
col

unionDistinctAscV :: (GCompare k) => Vessel k g -> Vessel k g -> Vessel k g
unionDistinctAscV :: Vessel k g -> Vessel k g -> Vessel k g
unionDistinctAscV (Vessel MonoidalDMap k (FlipAp g)
l) (Vessel MonoidalDMap k (FlipAp g)
r) = MonoidalDMap k (FlipAp g) -> Vessel k g
forall (k :: ((* -> *) -> *) -> *) (g :: * -> *).
MonoidalDMap k (FlipAp g) -> Vessel k g
Vessel (MonoidalDMap k (FlipAp g) -> Vessel k g)
-> MonoidalDMap k (FlipAp g) -> Vessel k g
forall a b. (a -> b) -> a -> b
$ (forall (v :: (* -> *) -> *).
 k v -> FlipAp g v -> FlipAp g v -> FlipAp g v)
-> MonoidalDMap k (FlipAp g)
-> MonoidalDMap k (FlipAp g)
-> MonoidalDMap k (FlipAp g)
forall k1 (k2 :: k1 -> *) (f :: k1 -> *).
GCompare k2 =>
(forall (v :: k1). k2 v -> f v -> f v -> f v)
-> MonoidalDMap k2 f -> MonoidalDMap k2 f -> MonoidalDMap k2 f
DMap.unionWithKey (\k v
_ FlipAp g v
x FlipAp g v
_ -> FlipAp g v
x) MonoidalDMap k (FlipAp g)
l MonoidalDMap k (FlipAp g)
r

splitV :: forall k t g v. (GCompare k, View v, Filterable t)
       => k v -> t (Vessel k g) -> (t (Vessel k g), t (Vessel k g))
splitV :: k v -> t (Vessel k g) -> (t (Vessel k g), t (Vessel k g))
splitV k v
pivot t (Vessel k g)
col = t (These (Vessel k g) (Vessel k g))
-> (t (Vessel k g), t (Vessel k g))
forall (f :: * -> *) a b.
Filterable f =>
f (These a b) -> (f a, f b)
unalignProperly (t (These (Vessel k g) (Vessel k g))
 -> (t (Vessel k g), t (Vessel k g)))
-> t (These (Vessel k g) (Vessel k g))
-> (t (Vessel k g), t (Vessel k g))
forall a b. (a -> b) -> a -> b
$ (Vessel k g -> Maybe (These (Vessel k g) (Vessel k g)))
-> t (Vessel k g) -> t (These (Vessel k g) (Vessel k g))
forall (f :: * -> *) a b.
Filterable f =>
(a -> Maybe b) -> f a -> f b
mapMaybe (k v -> Vessel k g -> Maybe (These (Vessel k g) (Vessel k g))
forall (k :: ((* -> *) -> *) -> *) (v :: (* -> *) -> *)
       (g :: * -> *).
(GCompare k, View v) =>
k v -> Vessel k g -> Maybe (These (Vessel k g) (Vessel k g))
splitOneV k v
pivot) t (Vessel k g)
col

splitOneV :: (GCompare k, View v) => k v -> Vessel k g -> Maybe (These (Vessel k g) (Vessel k g))
splitOneV :: k v -> Vessel k g -> Maybe (These (Vessel k g) (Vessel k g))
splitOneV k v
pivot Vessel k g
m =
  let (l :: Vessel k g
l@(Vessel MonoidalDMap k (FlipAp g)
l'), r :: Vessel k g
r@(Vessel MonoidalDMap k (FlipAp g)
r')) = k v -> Vessel k g -> (Vessel k g, Vessel k g)
forall (k :: ((* -> *) -> *) -> *) (v :: (* -> *) -> *)
       (g :: * -> *).
(GCompare k, View v) =>
k v -> Vessel k g -> (Vessel k g, Vessel k g)
splitLTV k v
pivot Vessel k g
m
  in case (MonoidalDMap k (FlipAp g) -> Bool
forall k1 (k2 :: k1 -> *) (f :: k1 -> *). MonoidalDMap k2 f -> Bool
DMap.null MonoidalDMap k (FlipAp g)
l', MonoidalDMap k (FlipAp g) -> Bool
forall k1 (k2 :: k1 -> *) (f :: k1 -> *). MonoidalDMap k2 f -> Bool
DMap.null MonoidalDMap k (FlipAp g)
r') of
    (Bool
True, Bool
True) -> Maybe (These (Vessel k g) (Vessel k g))
forall a. Maybe a
Nothing
    (Bool
False, Bool
True) -> These (Vessel k g) (Vessel k g)
-> Maybe (These (Vessel k g) (Vessel k g))
forall a. a -> Maybe a
Just (These (Vessel k g) (Vessel k g)
 -> Maybe (These (Vessel k g) (Vessel k g)))
-> These (Vessel k g) (Vessel k g)
-> Maybe (These (Vessel k g) (Vessel k g))
forall a b. (a -> b) -> a -> b
$ Vessel k g -> These (Vessel k g) (Vessel k g)
forall a b. a -> These a b
This Vessel k g
l
    (Bool
True, Bool
False) -> These (Vessel k g) (Vessel k g)
-> Maybe (These (Vessel k g) (Vessel k g))
forall a. a -> Maybe a
Just (These (Vessel k g) (Vessel k g)
 -> Maybe (These (Vessel k g) (Vessel k g)))
-> These (Vessel k g) (Vessel k g)
-> Maybe (These (Vessel k g) (Vessel k g))
forall a b. (a -> b) -> a -> b
$ Vessel k g -> These (Vessel k g) (Vessel k g)
forall a b. b -> These a b
That Vessel k g
r
    (Bool
False, Bool
False) -> These (Vessel k g) (Vessel k g)
-> Maybe (These (Vessel k g) (Vessel k g))
forall a. a -> Maybe a
Just (These (Vessel k g) (Vessel k g)
 -> Maybe (These (Vessel k g) (Vessel k g)))
-> These (Vessel k g) (Vessel k g)
-> Maybe (These (Vessel k g) (Vessel k g))
forall a b. (a -> b) -> a -> b
$ Vessel k g -> Vessel k g -> These (Vessel k g) (Vessel k g)
forall a b. a -> b -> These a b
These Vessel k g
l Vessel k g
r

splitLTV :: (GCompare k, View v) => k v -> Vessel k g -> (Vessel k g, Vessel k g)
splitLTV :: k v -> Vessel k g -> (Vessel k g, Vessel k g)
splitLTV k v
k (Vessel MonoidalDMap k (FlipAp g)
m) = case k v
-> MonoidalDMap k (FlipAp g)
-> (MonoidalDMap k (FlipAp g), Maybe (FlipAp g v),
    MonoidalDMap k (FlipAp g))
forall k1 (k2 :: k1 -> *) (f :: k1 -> *) (v :: k1).
GCompare k2 =>
k2 v
-> MonoidalDMap k2 f
-> (MonoidalDMap k2 f, Maybe (f v), MonoidalDMap k2 f)
DMap.splitLookup k v
k MonoidalDMap k (FlipAp g)
m of
  (MonoidalDMap k (FlipAp g)
l, Just (FlipAp v g
v), MonoidalDMap k (FlipAp g)
r) | Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ v g -> Bool
forall (v :: (* -> *) -> *) (i :: * -> *). View v => v i -> Bool
nullV v g
v -> (MonoidalDMap k (FlipAp g) -> Vessel k g
forall (k :: ((* -> *) -> *) -> *) (g :: * -> *).
MonoidalDMap k (FlipAp g) -> Vessel k g
Vessel (k v
-> FlipAp g v
-> MonoidalDMap k (FlipAp g)
-> MonoidalDMap k (FlipAp g)
forall k1 (k2 :: k1 -> *) (f :: k1 -> *) (v :: k1).
GCompare k2 =>
k2 v -> f v -> MonoidalDMap k2 f -> MonoidalDMap k2 f
DMap.insert k v
k (v g -> FlipAp g v
forall k (g :: k) (v :: k -> *). v g -> FlipAp g v
FlipAp v g
v) MonoidalDMap k (FlipAp g)
l), MonoidalDMap k (FlipAp g) -> Vessel k g
forall (k :: ((* -> *) -> *) -> *) (g :: * -> *).
MonoidalDMap k (FlipAp g) -> Vessel k g
Vessel MonoidalDMap k (FlipAp g)
r)
  (MonoidalDMap k (FlipAp g)
l, Maybe (FlipAp g v)
_, MonoidalDMap k (FlipAp g)
r) -> (MonoidalDMap k (FlipAp g) -> Vessel k g
forall (k :: ((* -> *) -> *) -> *) (g :: * -> *).
MonoidalDMap k (FlipAp g) -> Vessel k g
Vessel MonoidalDMap k (FlipAp g)
l, MonoidalDMap k (FlipAp g) -> Vessel k g
forall (k :: ((* -> *) -> *) -> *) (g :: * -> *).
MonoidalDMap k (FlipAp g) -> Vessel k g
Vessel MonoidalDMap k (FlipAp g)
r)

type instance ViewQueryResult (Vessel v g) = Vessel v (ViewQueryResult g)

vessel :: (GCompare k, ViewQueryResult (v g) ~ v (ViewQueryResult g), View v, Alternative n, Applicative m) => k v -> ViewMorphism m n (v g) (Vessel k g)
vessel :: k v -> ViewMorphism m n (v g) (Vessel k g)
vessel k v
k = ViewHalfMorphism m n (v g) (Vessel k g)
-> ViewHalfMorphism n m (Vessel k g) (v g)
-> ViewMorphism m n (v g) (Vessel k g)
forall (m :: * -> *) (n :: * -> *) p q.
ViewHalfMorphism m n p q
-> ViewHalfMorphism n m q p -> ViewMorphism m n p q
ViewMorphism (k v -> ViewHalfMorphism m n (v g) (Vessel k g)
forall (m :: * -> *) (n :: * -> *) (k :: ((* -> *) -> *) -> *)
       (v :: (* -> *) -> *) (g :: * -> *).
(Applicative m, Alternative n, GCompare k,
 ViewQueryResult (v g) ~ v (ViewQueryResult g), View v) =>
k v -> ViewHalfMorphism m n (v g) (Vessel k g)
toVessel k v
k) (k v -> ViewHalfMorphism n m (Vessel k g) (v g)
forall (m :: * -> *) (n :: * -> *) (k :: ((* -> *) -> *) -> *)
       (v :: (* -> *) -> *) (g :: * -> *).
(Alternative m, Applicative n, GCompare k,
 ViewQueryResult (v g) ~ v (ViewQueryResult g), View v) =>
k v -> ViewHalfMorphism m n (Vessel k g) (v g)
fromVessel k v
k)

toVessel :: (Applicative m, Alternative n, GCompare k, ViewQueryResult (v g) ~ v (ViewQueryResult g), View v) => k v -> ViewHalfMorphism m n (v g) (Vessel k g)
toVessel :: k v -> ViewHalfMorphism m n (v g) (Vessel k g)
toVessel k v
k = ViewHalfMorphism :: forall (m :: * -> *) (n :: * -> *) p q.
(p -> m q)
-> (ViewQueryResult q -> n (ViewQueryResult p))
-> ViewHalfMorphism m n p q
ViewHalfMorphism
  { _viewMorphism_mapQuery :: v g -> m (Vessel k g)
_viewMorphism_mapQuery = Vessel k g -> m (Vessel k g)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Vessel k g -> m (Vessel k g))
-> (v g -> Vessel k g) -> v g -> m (Vessel k g)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. k v -> v g -> Vessel k g
forall (v :: (* -> *) -> *) (k :: ((* -> *) -> *) -> *)
       (g :: * -> *).
View v =>
k v -> v g -> Vessel k g
singletonV k v
k
  , _viewMorphism_mapQueryResult :: ViewQueryResult (Vessel k g) -> n (ViewQueryResult (v g))
_viewMorphism_mapQueryResult = n (v (ViewQueryResult g))
-> (v (ViewQueryResult g) -> n (v (ViewQueryResult g)))
-> Maybe (v (ViewQueryResult g))
-> n (v (ViewQueryResult g))
forall b a. b -> (a -> b) -> Maybe a -> b
maybe n (v (ViewQueryResult g))
forall (f :: * -> *) a. Alternative f => f a
empty v (ViewQueryResult g) -> n (v (ViewQueryResult g))
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe (v (ViewQueryResult g)) -> n (v (ViewQueryResult g)))
-> (Vessel k (ViewQueryResult g) -> Maybe (v (ViewQueryResult g)))
-> Vessel k (ViewQueryResult g)
-> n (v (ViewQueryResult g))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. k v
-> Vessel k (ViewQueryResult g) -> Maybe (v (ViewQueryResult g))
forall (k :: ((* -> *) -> *) -> *) (v :: (* -> *) -> *)
       (g :: * -> *).
GCompare k =>
k v -> Vessel k g -> Maybe (v g)
lookupV k v
k
  }

fromVessel:: (Alternative m, Applicative n, GCompare k, ViewQueryResult (v g) ~ v (ViewQueryResult g), View v) => k v -> ViewHalfMorphism m n (Vessel k g) (v g)
fromVessel :: k v -> ViewHalfMorphism m n (Vessel k g) (v g)
fromVessel k v
k = ViewHalfMorphism :: forall (m :: * -> *) (n :: * -> *) p q.
(p -> m q)
-> (ViewQueryResult q -> n (ViewQueryResult p))
-> ViewHalfMorphism m n p q
ViewHalfMorphism
  { _viewMorphism_mapQuery :: Vessel k g -> m (v g)
_viewMorphism_mapQuery = m (v g) -> (v g -> m (v g)) -> Maybe (v g) -> m (v g)
forall b a. b -> (a -> b) -> Maybe a -> b
maybe m (v g)
forall (f :: * -> *) a. Alternative f => f a
empty v g -> m (v g)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe (v g) -> m (v g))
-> (Vessel k g -> Maybe (v g)) -> Vessel k g -> m (v g)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. k v -> Vessel k g -> Maybe (v g)
forall (k :: ((* -> *) -> *) -> *) (v :: (* -> *) -> *)
       (g :: * -> *).
GCompare k =>
k v -> Vessel k g -> Maybe (v g)
lookupV k v
k
  , _viewMorphism_mapQueryResult :: ViewQueryResult (v g) -> n (ViewQueryResult (Vessel k g))
_viewMorphism_mapQueryResult = Vessel k (ViewQueryResult g) -> n (Vessel k (ViewQueryResult g))
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Vessel k (ViewQueryResult g) -> n (Vessel k (ViewQueryResult g)))
-> (v (ViewQueryResult g) -> Vessel k (ViewQueryResult g))
-> v (ViewQueryResult g)
-> n (Vessel k (ViewQueryResult g))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. k v -> v (ViewQueryResult g) -> Vessel k (ViewQueryResult g)
forall (v :: (* -> *) -> *) (k :: ((* -> *) -> *) -> *)
       (g :: * -> *).
View v =>
k v -> v g -> Vessel k g
singletonV k v
k
  }

filterNullFlipAps :: (GCompare k, Has View k) => MonoidalDMap k (FlipAp f) -> MonoidalDMap k (FlipAp f)
filterNullFlipAps :: MonoidalDMap k (FlipAp f) -> MonoidalDMap k (FlipAp f)
filterNullFlipAps = (forall (v :: (* -> *) -> *).
 k v -> FlipAp f v -> Maybe (FlipAp f v))
-> MonoidalDMap k (FlipAp f) -> MonoidalDMap k (FlipAp f)
forall k1 (k2 :: k1 -> *) (f :: k1 -> *) (g :: k1 -> *).
GCompare k2 =>
(forall (v :: k1). k2 v -> f v -> Maybe (g v))
-> MonoidalDMap k2 f -> MonoidalDMap k2 g
DMap.mapMaybeWithKey (\k v
k (FlipAp v) -> k v -> (View v => Maybe (FlipAp f v)) -> Maybe (FlipAp f v)
forall k (c :: k -> Constraint) (f :: k -> *) (a :: k) r.
Has c f =>
f a -> (c a => r) -> r
has @View k v
k ((View v => Maybe (FlipAp f v)) -> Maybe (FlipAp f v))
-> (View v => Maybe (FlipAp f v)) -> Maybe (FlipAp f v)
forall a b. (a -> b) -> a -> b
$ v f -> FlipAp f v
forall k (g :: k) (v :: k -> *). v g -> FlipAp g v
FlipAp (v f -> FlipAp f v) -> Maybe (v f) -> Maybe (FlipAp f v)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> v f -> Maybe (v f)
forall (v :: (* -> *) -> *) (f :: * -> *).
View v =>
v f -> Maybe (v f)
collapseNullV v f
v)