{-| Module  : FiniteCategories
Description : An example of 'SafeCompositionGraph' pretty printed.
Copyright   : Guillaume Sabbagh 2022
License     : GPL-3
Maintainer  : guillaumesabbagh@protonmail.com
Stability   : experimental
Portability : portable

An example of 'SafeCompositionGraph' pretty printed.

A 'SafeCompositionGraph' created from a string is also pretty printed.

A random 'SafeCompositionGraph' is also pretty printed.
-}
module Math.FiniteCategories.SafeCompositionGraph.Example
(
    main
)
where
    import qualified Data.WeakSet as Set
    import Data.WeakSet.Safe
    import Data.WeakMap.Safe
    
    import Math.FiniteCategory
    import Math.Categories
    import Math.FiniteCategories
    
    import Math.IO.PrettyPrint
    
    import Numeric.Natural
    import System.Random
    
    -- | An example of 'SafeCompositionGraph' pretty printed.

    main :: IO ()
    main :: IO ()
main = do
        String -> IO ()
putStrLn String
"Start of Math.FiniteCategories.SafeCompositionGraph.Example"
        String -> IO ()
putStrLn (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$  SafeCompositionGraph Int Char -> String
forall c m o.
(FiniteCategory c m o, Morphism m o, PrettyPrint c, PrettyPrint m,
 PrettyPrint o, Eq m, Eq o) =>
c -> String
pprintFiniteCategory (Graph Int Char
-> CompositionLaw Int Char -> Int -> SafeCompositionGraph Int Char
forall a b.
Graph a b -> CompositionLaw a b -> Int -> SafeCompositionGraph a b
unsafeSafeCompositionGraph (Set Int -> Set (Arrow Int Char) -> Graph Int Char
forall n e. Set n -> Set (Arrow n e) -> Graph n e
unsafeGraph ([Int] -> Set Int
forall a. [a] -> Set a
set [Int
1 :: Int,Int
2,Int
3]) ([Arrow Int Char] -> Set (Arrow Int Char)
forall a. [a] -> Set a
set [Arrow{sourceArrow :: Int
sourceArrow=Int
1,targetArrow :: Int
targetArrow=Int
1,labelArrow :: Char
labelArrow=Char
'a'},Arrow{sourceArrow :: Int
sourceArrow=Int
1,targetArrow :: Int
targetArrow=Int
2,labelArrow :: Char
labelArrow=Char
'b'},Arrow{sourceArrow :: Int
sourceArrow=Int
2,targetArrow :: Int
targetArrow=Int
3,labelArrow :: Char
labelArrow=Char
'c'}])) (AssociationList [Arrow Int Char] [Arrow Int Char]
-> CompositionLaw Int Char
forall k v. AssociationList k v -> Map k v
weakMap [([Arrow{sourceArrow :: Int
sourceArrow=Int
1,targetArrow :: Int
targetArrow=Int
1,labelArrow :: Char
labelArrow=Char
'a'},Arrow{sourceArrow :: Int
sourceArrow=Int
1,targetArrow :: Int
targetArrow=Int
1,labelArrow :: Char
labelArrow=Char
'a'}],[Arrow{sourceArrow :: Int
sourceArrow=Int
1,targetArrow :: Int
targetArrow=Int
1,labelArrow :: Char
labelArrow=Char
'a'}])]) Int
3) 
        String -> IO ()
putStrLn (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$  SafeCompositionGraph Int Char -> String
forall c m o.
(FiniteCategory c m o, Morphism m o, PrettyPrint c, PrettyPrint m,
 PrettyPrint o, Eq m, Eq o) =>
c -> String
pprintFiniteCategory (Graph Int Char
-> CompositionLaw Int Char -> Int -> SafeCompositionGraph Int Char
forall a b.
Graph a b -> CompositionLaw a b -> Int -> SafeCompositionGraph a b
unsafeSafeCompositionGraph (Set Int -> Set (Arrow Int Char) -> Graph Int Char
forall n e. Set n -> Set (Arrow n e) -> Graph n e
unsafeGraph ([Int] -> Set Int
forall a. [a] -> Set a
set [Int
1 :: Int]) ([Arrow Int Char] -> Set (Arrow Int Char)
forall a. [a] -> Set a
set [Arrow{sourceArrow :: Int
sourceArrow=Int
1,targetArrow :: Int
targetArrow=Int
1,labelArrow :: Char
labelArrow=Char
'a'}])) (AssociationList [Arrow Int Char] [Arrow Int Char]
-> CompositionLaw Int Char
forall k v. AssociationList k v -> Map k v
weakMap []) Int
3) 
        
        String -> IO ()
putStrLn (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$  SafeCompositionGraph Int Int -> String
forall c m o.
(FiniteCategory c m o, Morphism m o, PrettyPrint c, PrettyPrint m,
 PrettyPrint o, Eq m, Eq o) =>
c -> String
pprintFiniteCategory ((SafeCompositionGraph Int Int, StdGen)
-> SafeCompositionGraph Int Int
forall a b. (a, b) -> a
fst((SafeCompositionGraph Int Int, StdGen)
 -> SafeCompositionGraph Int Int)
-> (StdGen -> (SafeCompositionGraph Int Int, StdGen))
-> StdGen
-> SafeCompositionGraph Int Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
.StdGen -> (SafeCompositionGraph Int Int, StdGen)
forall g. RandomGen g => g -> (SafeCompositionGraph Int Int, g)
defaultConstructRandomSafeCompositionGraph (StdGen -> SafeCompositionGraph Int Int)
-> StdGen -> SafeCompositionGraph Int Int
forall a b. (a -> b) -> a -> b
$ (Int -> StdGen
mkStdGen Int
123456)) 
        
        let (Right SCG
scg) = String
-> Either (FiniteCategoryError (SCGMorphism Text Text) Text) SCG
readSCGString String
"2\nA -f-> B -g-> C = A -h-> C"
        String -> IO ()
putStrLn (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$  SCG -> String
forall c m o.
(FiniteCategory c m o, Morphism m o, PrettyPrint c, PrettyPrint m,
 PrettyPrint o, Eq m, Eq o) =>
c -> String
pprintFiniteCategory SCG
scg 
        String -> IO ()
putStrLn String
"End of Math.FiniteCategories.SafeCompositionGraph.Example"