packages feed

proton-0.0.1: src/Examples/Layers.hs

{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TupleSections #-}
module Examples.Layers where

import Proton
import Data.Profunctor
import Data.Profunctor.Rep
import Data.Profunctor.MStrong
import Proton.Algebraic
import qualified Data.Map as M
import Data.Foldable
import Data.Maybe

imgLayers :: [[Int]]
imgLayers = [ [0, 1, 0, 1]
            , [2, 3, 3, 2]
            ]

-- done :: [Int]
-- done = imgLayers & pointWise *% head . dropWhile (== 0)

-- selector :: (Ord k, Corep p ~ M.Map k, Corepresentable p) => Optic p s [Maybe s] s [k]
-- selector = listLens id (\(m, k) -> flip M.lookup m <$> k)

-- done' = M.fromList [(1 :: Int, [1, 10]), (2, [2, 20]), (3, [3, 30])]  & selector . convolving *% M.findWithDefault 99 1

forward :: Profunctor p => (s -> a) -> Optic p s t a t
forward f = lmap f

back :: Profunctor p => (x -> t) -> Optic p s t s x
back f = rmap f

lookup'er :: Eq a => AlgebraicLens (a, b) (a, Maybe b) a a
lookup'er = listLens fst (\xs i -> (i, lookup i xs))

-- test :: IO ()
-- test = do
--     print $ [([1, 2] , "one" :: String), ([10, 0], "two")] & lookup'er . pointWise *% maximum