{-| Module  : FiniteCategories
Description : An example of parallel diagram.
Copyright   : Guillaume Sabbagh 2021
License     : GPL-3
Maintainer  : guillaumesabbagh@protonmail.com
Stability   : experimental
Portability : portable

An example of parallel diagram.
-}
module ExampleDiagram.ExampleParallelDiagram
(
    parallelDiag,
    main
)
where
    import              RandomCompositionGraph.RandomCompositionGraph
    import              System.Random                                   
    import              ExportGraphViz.ExportGraphViz                   (catToPdf,diagToPdf,diagToPdf2)
    import              Diagram.Diagram                                 (mkParallel, src)
    import              Utils.Sample
    import              FiniteCategory.FiniteCategory       hiding      (FiniteCategoryError(..))
    import              Data.Maybe                                      (fromJust)

    (rcg1,newGen) = (mkRandomCompositionGraph 10 15 3 (mkStdGen 1234))
    
    (arToPickFrom,newGen2) = (pickOne [ar rcg1 a b|a <- ob rcg1, b <- ob rcg1, length (ar rcg1 a b) > 1, a/=b] newGen)
    ([f,g],newGen3) = (sample arToPickFrom 2 newGen2)
    
    -- | We select a two parallel morphism in a random category.
    parallelDiag = fromJust $ (mkParallel rcg1 f g)

    -- | Export the diagram as a pdf with GraphViz.
    main = do 
        putStrLn "Start of ExampleParallelDiagram"
        catToPdf rcg1 "OutputGraphViz/Examples/Diagram/ParallelDiagram/rcg1"
        catToPdf (src parallelDiag) "OutputGraphViz/Examples/Diagram/ParallelDiagram/Parallel"
        diagToPdf parallelDiag "OutputGraphViz/Examples/Diagram/ParallelDiagram/functor"
        diagToPdf2 parallelDiag "OutputGraphViz/Examples/Diagram/ParallelDiagram/diag"
        putStrLn "End of ExampleParallelDiagram"