{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FunctionalDependencies #-}
module Proton.Indexed where

import Data.Profunctor
import Data.Profunctor.Traversing
import Control.Arrow ((&&&))
import Data.Profunctor.Indexed
import Proton.Types

indexing :: (Indexable i p q) => (s -> i) -> p s t -> q s t
indexing :: (s -> i) -> p s t -> q s t
indexing f :: s -> i
f p :: p s t
p = (s -> (i, s)) -> q (i, s) t -> q s t
forall (p :: * -> * -> *) a b c.
Profunctor p =>
(a -> b) -> p b c -> p a c
lmap (s -> i
f (s -> i) -> (s -> s) -> s -> (i, s)
forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&& s -> s
forall a. a -> a
id) (q (i, s) t -> q s t) -> q (i, s) t -> q s t
forall a b. (a -> b) -> a -> b
$ p s t -> q (i, s) t
forall i (p :: * -> * -> *) (q :: * -> * -> *) a b.
Indexable i p q =>
p a b -> q (i, a) b
indexed p s t
p

-- itraversed :: (Indexable Int p q, Traversing q) => p a b -> q [a] [b]
itraversed :: Traversing p => IndexedOptic Int p [a] [b] a b
itraversed :: IndexedOptic Int p [a] [b] a b
itraversed p :: p a b
p = ([a] -> [(Int, a)]) -> p [(Int, a)] [b] -> p [a] [b]
forall (p :: * -> * -> *) a b c.
Profunctor p =>
(a -> b) -> p b c -> p a c
lmap ([Int] -> [a] -> [(Int, a)]
forall a b. [a] -> [b] -> [(a, b)]
zip [(0 :: Int)..]) (p [(Int, a)] [b] -> p [a] [b])
-> (p (Int, a) b -> p [(Int, a)] [b]) -> p (Int, a) b -> p [a] [b]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. p (Int, a) b -> p [(Int, a)] [b]
forall (p :: * -> * -> *) (f :: * -> *) a b.
(Traversing p, Traversable f) =>
p a b -> p (f a) (f b)
traverse' (p (Int, a) b -> p [a] [b]) -> p (Int, a) b -> p [a] [b]
forall a b. (a -> b) -> a -> b
$ p a b -> p (Int, a) b
forall i (p :: * -> * -> *) (q :: * -> * -> *) a b.
Indexable i p q =>
p a b -> q (i, a) b
indexed p a b
p

itoListOf :: IndexedOptic i (Forget [(i, a)]) s t a b -> s -> [(i, a)]
itoListOf :: IndexedOptic i (Forget [(i, a)]) s t a b -> s -> [(i, a)]
itoListOf fld :: IndexedOptic i (Forget [(i, a)]) s t a b
fld = Forget [(i, a)] s t -> s -> [(i, a)]
forall r a b. Forget r a b -> a -> r
runForget (Optical (Indexed i (Forget [(i, a)])) (Forget [(i, a)]) s t a b
IndexedOptic i (Forget [(i, a)]) s t a b
fld (Forget [(i, a)] (i, a) b -> Indexed i (Forget [(i, a)]) a b
forall i (p :: * -> * -> *) a b. p (i, a) b -> Indexed i p a b
Indexed (((i, a) -> [(i, a)]) -> Forget [(i, a)] (i, a) b
forall r a b. (a -> r) -> Forget r a b
Forget (i, a) -> [(i, a)]
forall (f :: * -> *) a. Applicative f => a -> f a
pure)))

iover :: IndexedOptic i (->) s t a b -> (i -> a -> b) -> s -> t
iover :: IndexedOptic i (->) s t a b -> (i -> a -> b) -> s -> t
iover setter :: IndexedOptic i (->) s t a b
setter f :: i -> a -> b
f = Optical (Indexed i (->)) (->) s t a b
IndexedOptic i (->) s t a b
setter (((i, a) -> b) -> Indexed i (->) a b
forall i (p :: * -> * -> *) a b. p (i, a) b -> Indexed i p a b
Indexed ((i -> a -> b) -> (i, a) -> b
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry i -> a -> b
f))

iset :: IndexedOptic i (->) s t a b -> (i -> b) -> s -> t
iset :: IndexedOptic i (->) s t a b -> (i -> b) -> s -> t
iset setter :: IndexedOptic i (->) s t a b
setter f :: i -> b
f = IndexedOptic i (->) s t a b -> (i -> a -> b) -> s -> t
forall i s t a b.
IndexedOptic i (->) s t a b -> (i -> a -> b) -> s -> t
iover IndexedOptic i (->) s t a b
setter (\i :: i
i _ -> i -> b
f i
i)