module Examples.Diffract where import Data.Pair import Proton split :: [a] -> Pair [a] split :: [a] -> Pair [a] split x :: [a] x = [a] -> [a] -> Pair [a] forall a. a -> a -> Pair a Pair [a] x ([a] -> [a] forall a. [a] -> [a] reverse [a] x) splitter :: (a, a) -> Pair a splitter :: (a, a) -> Pair a splitter (a :: a a, b :: a b) = a -> a -> Pair a forall a. a -> a -> Pair a Pair a a a b example :: IO () example :: IO () example = do Pair [[Int]] -> IO () forall a. Show a => a -> IO () print (Pair [[Int]] -> IO ()) -> Pair [[Int]] -> IO () forall a b. (a -> b) -> a -> b $ Optic (Star Pair) [[(Int, Int)]] [[Int]] (Int, Int) Int -> ((Int, Int) -> Pair Int) -> [[(Int, Int)]] -> Pair [[Int]] forall (f :: * -> *) s t a b. Distributive f => Optic (Star f) s t a b -> (a -> f b) -> s -> f t diffract (Star Pair [(Int, Int)] [Int] -> Star Pair [[(Int, Int)]] [[Int]] forall (f :: * -> *) a b. Traversable f => Traversal (f a) (f b) a b traversed (Star Pair [(Int, Int)] [Int] -> Star Pair [[(Int, Int)]] [[Int]]) -> (Star Pair (Int, Int) Int -> Star Pair [(Int, Int)] [Int]) -> Optic (Star Pair) [[(Int, Int)]] [[Int]] (Int, Int) Int forall b c a. (b -> c) -> (a -> b) -> a -> c . Star Pair (Int, Int) Int -> Star Pair [(Int, Int)] [Int] forall (f :: * -> *) a b. Traversable f => Traversal (f a) (f b) a b traversed) (Int, Int) -> Pair Int forall a. (a, a) -> Pair a splitter [[(1, 2), (3, 4)], [(5, 6), (7, 8 :: Int)]]