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)]]