diff --git a/README.md b/README.md index 0e150002c..25f5071bb 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ stack ghci --stack-yaml=stack-examples.yaml --package=autotool-capabilities-io- ``` ```haskell -:m + Capabilities.Alloy.IO Capabilities.Cache.IO Capabilities.Diagrams.IO Capabilities.Graphviz.IO Capabilities.LatexSvg.IO Capabilities.PlantUml.IO Capabilities.WriteFile.IO +:m + Capabilities.Alloy.IO Capabilities.Cache.IO Capabilities.Diagrams.IO Capabilities.Graphviz.IO Capabilities.LatexSvg.IO Capabilities.PlantUml.IO :m + Control.OutputCapable.Blocks Control.OutputCapable.Blocks.Generic inst <- nameCdErrorGenerate defaultNameCdErrorConfig 0 0 runLangMReport (return ()) (>>) (nameCdErrorTask True "/tmp/" inst) >>= \(Just (), x) -> (x English :: IO ()) diff --git a/app/check-cds.hs b/app/check-cds.hs index 16589f04d..f4675684a 100644 --- a/app/check-cds.hs +++ b/app/check-cds.hs @@ -6,7 +6,7 @@ import qualified Language.Alloy.Call as Alloy (getInstances) import Capabilities.Diagrams.IO () import Capabilities.Graphviz.IO () -import Capabilities.WriteFile.IO () +import Modelling.CdOd.Auxiliary.Util (alloyInstanceToOd) import Modelling.CdOd.CD2Alloy.Transform ( LinguisticReuse (None), Parts (..), @@ -15,7 +15,7 @@ import Modelling.CdOd.CD2Alloy.Transform ( mergeParts, transform, ) -import Modelling.CdOd.Output (drawCd, drawOdFromInstance) +import Modelling.CdOd.Output (drawCd, drawOd) import Modelling.CdOd.Types ( AnyCd, Cd, @@ -24,14 +24,14 @@ import Modelling.CdOd.Types ( ObjectConfig (objectLimits), ObjectProperties (..), Relationship (..), + anonymiseObjects, defaultCdDrawSettings, fromClassDiagram, maxFiveObjects, relationshipName, ) -import Control.Monad.Random (RandT, RandomGen, evalRandT, getStdGen) -import Control.Monad.Trans.Class (MonadTrans (lift)) +import Control.Monad.Random (RandomGen, evalRandT, getStdGen) import Data.Foldable (toList) import Data.GraphViz (DirType (..)) import Data.Maybe (mapMaybe) @@ -228,19 +228,17 @@ drawCdAndOdsFor is c cds cmd = do ods <- Alloy.getInstances is parts' g <- getStdGen let possibleLinks = toList allRelationshipNames - flip evalRandT g $ - mapM_ (\(od, i) -> drawOd possibleLinks od i >>= lift . putStrLn) + mapM_ (\(od, i) -> drawOdToFile possibleLinks od i g >>= putStrLn) $ zip (maybe id (take . fromInteger) is ods) [1..] where - drawOd :: RandomGen g => [String] -> AlloyInstance -> Int -> RandT g IO FilePath - drawOd allRelationshipNames od i = drawOdFromInstance - od - Nothing - allRelationshipNames - Nothing - Back - True - (c ++ '-' : shorten cmd ++ "-od" ++ show i ++ ".svg") + drawOdToFile :: RandomGen g => [String] -> AlloyInstance -> Int -> g -> IO FilePath + drawOdToFile allRelationshipNames inst i g = do + od <- alloyInstanceToOd Nothing allRelationshipNames inst + od' <- flip evalRandT g $ anonymiseObjects (1 % 3) od + renderedOd <- drawOd od' Nothing Back True + let path = c ++ '-' : shorten cmd ++ "-od" ++ show i ++ ".svg" + BS.writeFile path renderedOd + pure path drawCd' :: AnyCd -> Int -> IO String drawCd' cd i = do renderedCd <- drawCd defaultCdDrawSettings mempty Nothing cd diff --git a/app/enterASTaskDemo.hs b/app/enterASTaskDemo.hs index 5921accad..796ef2c36 100644 --- a/app/enterASTaskDemo.hs +++ b/app/enterASTaskDemo.hs @@ -2,7 +2,7 @@ module Main (main) where import Capabilities.Alloy.IO () import Capabilities.PlantUml.IO () -import Capabilities.WriteFile.IO () +import Capabilities.Cache.IO () import Modelling.ActivityDiagram.EnterAS ( defaultEnterASConfig, enterAS, diff --git a/app/findAuxiliaryPetriNodesTaskDemo.hs b/app/findAuxiliaryPetriNodesTaskDemo.hs index 80ade1436..7536fc8ce 100644 --- a/app/findAuxiliaryPetriNodesTaskDemo.hs +++ b/app/findAuxiliaryPetriNodesTaskDemo.hs @@ -2,7 +2,7 @@ module Main (main) where import Capabilities.Alloy.IO () import Capabilities.PlantUml.IO () -import Capabilities.WriteFile.IO () +import Capabilities.Cache.IO () import Modelling.ActivityDiagram.FindAuxiliaryPetriNodes ( defaultFindAuxiliaryPetriNodesConfig, findAuxiliaryPetriNodes, diff --git a/app/matchAdTaskDemo.hs b/app/matchAdTaskDemo.hs index a5eaa48c7..858be9926 100644 --- a/app/matchAdTaskDemo.hs +++ b/app/matchAdTaskDemo.hs @@ -2,7 +2,7 @@ module Main (main) where import Capabilities.Alloy.IO () import Capabilities.PlantUml.IO () -import Capabilities.WriteFile.IO () +import Capabilities.Cache.IO () import Modelling.ActivityDiagram.MatchAd ( defaultMatchAdConfig, matchAd, diff --git a/app/matchPetriTaskDemo.hs b/app/matchPetriTaskDemo.hs index 8478446b5..eefc4b791 100644 --- a/app/matchPetriTaskDemo.hs +++ b/app/matchPetriTaskDemo.hs @@ -5,7 +5,6 @@ import Capabilities.Cache.IO () import Capabilities.Diagrams.IO () import Capabilities.Graphviz.IO () import Capabilities.PlantUml.IO () -import Capabilities.WriteFile.IO () import Modelling.ActivityDiagram.MatchPetri ( defaultMatchPetriConfig, matchPetri, diff --git a/app/selectASTaskDemo.hs b/app/selectASTaskDemo.hs index 505175e8c..4b9062292 100644 --- a/app/selectASTaskDemo.hs +++ b/app/selectASTaskDemo.hs @@ -2,7 +2,7 @@ module Main (main) where import Capabilities.Alloy.IO () import Capabilities.PlantUml.IO () -import Capabilities.WriteFile.IO () +import Capabilities.Cache.IO () import Modelling.ActivityDiagram.SelectAS ( defaultSelectASConfig, selectAS, diff --git a/app/selectPetriTaskDemo.hs b/app/selectPetriTaskDemo.hs index 0e56d9dbc..d24a0a95c 100644 --- a/app/selectPetriTaskDemo.hs +++ b/app/selectPetriTaskDemo.hs @@ -5,7 +5,6 @@ import Capabilities.Cache.IO () import Capabilities.Diagrams.IO () import Capabilities.Graphviz.IO () import Capabilities.PlantUml.IO () -import Capabilities.WriteFile.IO () import Modelling.ActivityDiagram.SelectPetri ( defaultSelectPetriConfig, selectPetri, diff --git a/legacy-app/cd2pic.hs b/legacy-app/cd2pic.hs index ea41720c4..077b5bc43 100644 --- a/legacy-app/cd2pic.hs +++ b/legacy-app/cd2pic.hs @@ -4,7 +4,6 @@ import qualified Data.ByteString as BS (writeFile) import Capabilities.Diagrams.IO () import Capabilities.Graphviz.IO () -import Capabilities.WriteFile.IO () import Modelling.CdOd.Auxiliary.Lexer (lexer) import Modelling.CdOd.Auxiliary.Parser (parser) import Modelling.CdOd.Output diff --git a/legacy-app/instance2pic.hs b/legacy-app/instance2pic.hs index bb54cd486..5b6f6988b 100644 --- a/legacy-app/instance2pic.hs +++ b/legacy-app/instance2pic.hs @@ -1,14 +1,14 @@ module Main (main) where -import qualified Data.ByteString.Char8 as BS (pack) +import qualified Data.ByteString.Char8 as BS (pack, writeFile) import Capabilities.Diagrams.IO () import Capabilities.Graphviz.IO () -import Capabilities.WriteFile.IO () -import Modelling.CdOd.Output (drawOdFromInstance) +import Modelling.CdOd.Auxiliary.Util (alloyInstanceToOd) +import Modelling.CdOd.Output (drawOd) +import Modelling.CdOd.Types (anonymiseObjects) import Control.Monad (void) import Control.Monad.Random (evalRandT, mkStdGen) -import Control.Monad.Trans.Class (MonadTrans (lift)) import Data.Char (toUpper) import Data.GraphViz (DirType (NoDir)) import Data.Ratio ((%)) @@ -21,23 +21,20 @@ main = do args <- getArgs void $ case args of [] -> error "possible links required (first parameter)" - [xs] -> getContents >>= drawOd (read xs) "output" - [xs, file] -> readFile file >>= drawOd (read xs) file + [xs] -> getContents >>= drawOdToFile (read xs) "output" + [xs, file] -> readFile file >>= drawOdToFile (read xs) file [xs, file, format] - | map toUpper format == "SVG" -> readFile file >>= drawOd (read xs) file + | map toUpper format == "SVG" -> readFile file >>= drawOdToFile (read xs) file | otherwise -> error $ "format " ++ format ++ "is not supported, only SVG is supported" _ -> error "zu viele Parameter" -drawOd :: [String] -> FilePath -> String -> IO () -drawOd possibleLinks file contents = flip evalRandT (mkStdGen 0) $ do - i <- lift $ parseInstance $ BS.pack contents - output <- drawOdFromInstance - i - Nothing - possibleLinks - (Just $ 1 % 3) - NoDir - False - (file ++ ".svg") - lift . putStrLn $ "Output written to " ++ output +drawOdToFile :: [String] -> FilePath -> String -> IO () +drawOdToFile possibleLinks file contents = do + i <- parseInstance (BS.pack contents) + od <- alloyInstanceToOd Nothing possibleLinks i + od' <- flip evalRandT (mkStdGen 0) $ anonymiseObjects (1 % 3) od + renderedOd <- drawOd od' Nothing NoDir False + let filename = file ++ ".svg" + BS.writeFile filename renderedOd + putStrLn $ "Output written to " ++ filename diff --git a/src/Modelling/ActivityDiagram/EnterAS.hs b/src/Modelling/ActivityDiagram/EnterAS.hs index 7f2aa195c..7c9022b90 100644 --- a/src/Modelling/ActivityDiagram/EnterAS.hs +++ b/src/Modelling/ActivityDiagram/EnterAS.hs @@ -29,7 +29,7 @@ import Autolib.Reader (Reader) import Autolib.ToDoc (ToDoc) import Capabilities.Alloy (MonadAlloy, getInstances) import Capabilities.PlantUml (MonadPlantUml) -import Capabilities.WriteFile (MonadWriteFile) +import Capabilities.Cache (MonadCache) import Modelling.ActivityDiagram.ActionSequences ( generateActionSequencesWithPetri, netAndMap, @@ -215,7 +215,7 @@ enterActionSequence petri = EnterASSolution {sampleSolution = head $ generateActionSequencesWithPetri petri Nothing} enterASTask - :: (MonadPlantUml m, MonadWriteFile m, OutputCapable m) + :: (MonadPlantUml m, MonadCache m, OutputCapable m) => Bool -> FilePath -> EnterASInstance diff --git a/src/Modelling/ActivityDiagram/FindAuxiliaryPetriNodes.hs b/src/Modelling/ActivityDiagram/FindAuxiliaryPetriNodes.hs index e61a651ea..c91f3bf83 100644 --- a/src/Modelling/ActivityDiagram/FindAuxiliaryPetriNodes.hs +++ b/src/Modelling/ActivityDiagram/FindAuxiliaryPetriNodes.hs @@ -39,7 +39,7 @@ import Autolib.Reader (Reader) import Autolib.ToDoc (ToDoc) import Capabilities.Alloy (MonadAlloy, getInstances) import Capabilities.PlantUml (MonadPlantUml) -import Capabilities.WriteFile (MonadWriteFile) +import Capabilities.Cache (MonadCache) import Modelling.ActivityDiagram.Alloy ( adConfigToAlloy, modulePetriNet, @@ -213,7 +213,7 @@ findAuxiliaryPetriNodesSolution' petri = FindAuxiliaryPetriNodesSolution { auxiliaryTransitionsCount = M.size $ M.filter isTransitionNode auxiliaryPetriNodeMap findAuxiliaryPetriNodesTask - :: (MonadPlantUml m, MonadWriteFile m, OutputCapable m) + :: (MonadPlantUml m, MonadCache m, OutputCapable m) => Bool -> FilePath -> FindAuxiliaryPetriNodesInstance diff --git a/src/Modelling/ActivityDiagram/MatchAd.hs b/src/Modelling/ActivityDiagram/MatchAd.hs index fe42862bb..ebb8a9cbc 100644 --- a/src/Modelling/ActivityDiagram/MatchAd.hs +++ b/src/Modelling/ActivityDiagram/MatchAd.hs @@ -26,7 +26,7 @@ import qualified Data.Map as M (fromList, keys) import Capabilities.Alloy (MonadAlloy, getInstances) import Capabilities.PlantUml (MonadPlantUml) -import Capabilities.WriteFile (MonadWriteFile) +import Capabilities.Cache (MonadCache) import Modelling.ActivityDiagram.Alloy (adConfigToAlloy) import Modelling.ActivityDiagram.Config ( AdConfig (..), @@ -177,7 +177,7 @@ matchAdSolution task = } matchAdTask - :: (MonadPlantUml m, MonadWriteFile m, OutputCapable m) + :: (MonadPlantUml m, MonadCache m, OutputCapable m) => Bool -> FilePath -> MatchAdInstance diff --git a/src/Modelling/ActivityDiagram/MatchPetri.hs b/src/Modelling/ActivityDiagram/MatchPetri.hs index b1b124f6d..bbc52b741 100644 --- a/src/Modelling/ActivityDiagram/MatchPetri.hs +++ b/src/Modelling/ActivityDiagram/MatchPetri.hs @@ -44,7 +44,6 @@ import Capabilities.Cache (MonadCache) import Capabilities.Diagrams (MonadDiagrams) import Capabilities.Graphviz (MonadGraphviz) import Capabilities.PlantUml (MonadPlantUml) -import Capabilities.WriteFile (MonadWriteFile) import Modelling.ActivityDiagram.Alloy (adConfigToAlloy, modulePetriNet) import Modelling.ActivityDiagram.Datatype ( UMLActivityDiagram(..), @@ -346,7 +345,6 @@ matchPetriTask MonadGraphviz m, MonadPlantUml m, MonadThrow m, - MonadWriteFile m, OutputCapable m ) => Bool diff --git a/src/Modelling/ActivityDiagram/PlantUMLConverter.hs b/src/Modelling/ActivityDiagram/PlantUMLConverter.hs index febaccc14..54f690c1f 100644 --- a/src/Modelling/ActivityDiagram/PlantUMLConverter.hs +++ b/src/Modelling/ActivityDiagram/PlantUMLConverter.hs @@ -13,14 +13,14 @@ module Modelling.ActivityDiagram.PlantUMLConverter ( import Data.ByteString (ByteString) import Data.List ( delete, intercalate, intersect, union ) -import Data.String.Interpolate ( i, __i ) +import Data.String.Interpolate ( __i ) import GHC.Generics (Generic) import Autolib.Hash (Hashable) import Autolib.Reader (Reader) import Autolib.ToDoc (ToDoc) import Capabilities.PlantUml (MonadPlantUml (drawPlantUmlSvg)) -import Capabilities.WriteFile (MonadWriteFile (writeToFile)) +import Capabilities.Cache (MonadCache, cache) import Modelling.ActivityDiagram.Datatype ( AdNode (..), UMLActivityDiagram(..), @@ -41,18 +41,13 @@ defaultPlantUmlConfig = PlantUmlConfig { } drawAdToFile - :: (MonadPlantUml m, MonadWriteFile m) + :: (MonadPlantUml m, MonadCache m) => FilePath -> PlantUmlConfig -> UMLActivityDiagram -> m FilePath -drawAdToFile path conf ad = do - renderedAd <- drawPlantUmlSvg $ convertToPlantUML' conf ad - writeToFile adFilename renderedAd - return adFilename - where - adFilename :: FilePath - adFilename = [i|#{path}Diagram.svg|] +drawAdToFile path conf ad = cache path ".svg" "ActivityDiagram-" (conf,ad) + $ drawPlantUmlSvg . uncurry convertToPlantUML' convertToPlantUML :: UMLActivityDiagram -> ByteString convertToPlantUML = convertToPlantUML' defaultPlantUmlConfig diff --git a/src/Modelling/ActivityDiagram/SelectAS.hs b/src/Modelling/ActivityDiagram/SelectAS.hs index e1b6fa18c..4dcd57b72 100644 --- a/src/Modelling/ActivityDiagram/SelectAS.hs +++ b/src/Modelling/ActivityDiagram/SelectAS.hs @@ -31,7 +31,7 @@ import Autolib.Reader (Reader) import Autolib.ToDoc (ToDoc) import Capabilities.Alloy (MonadAlloy, getInstances) import Capabilities.PlantUml (MonadPlantUml) -import Capabilities.WriteFile (MonadWriteFile) +import Capabilities.Cache (MonadCache) import Modelling.ActivityDiagram.ActionSequences ( generateActionSequencesWithPetri, generateActionSequenceWithPetriAndRepetition, @@ -287,7 +287,7 @@ asEditDistParams xs = Params } selectASTask - :: (MonadPlantUml m, MonadWriteFile m, OutputCapable m) + :: (MonadPlantUml m, MonadCache m, OutputCapable m) => Bool -> FilePath -> SelectASInstance diff --git a/src/Modelling/ActivityDiagram/SelectPetri.hs b/src/Modelling/ActivityDiagram/SelectPetri.hs index d62873d50..82d766095 100644 --- a/src/Modelling/ActivityDiagram/SelectPetri.hs +++ b/src/Modelling/ActivityDiagram/SelectPetri.hs @@ -35,7 +35,6 @@ import Capabilities.Cache (MonadCache) import Capabilities.Diagrams (MonadDiagrams) import Capabilities.Graphviz (MonadGraphviz) import Capabilities.PlantUml (MonadPlantUml) -import Capabilities.WriteFile (MonadWriteFile) import qualified Data.Map as M (empty, size, fromList, toList, keys, map, filter) import qualified Modelling.ActivityDiagram.Datatype as Ad (AdNode(label)) import qualified Modelling.ActivityDiagram.PetriNet as PK (PetriKey (label)) @@ -368,7 +367,6 @@ selectPetriTask MonadGraphviz m, MonadPlantUml m, MonadThrow m, - MonadWriteFile m, OutputCapable m ) => Bool @@ -444,7 +442,6 @@ selectPetriEvaluation MonadGraphviz m, MonadPlantUml m, MonadThrow m, - MonadWriteFile m, OutputCapable m ) => FilePath diff --git a/src/Modelling/CdOd/Output.hs b/src/Modelling/CdOd/Output.hs index fb2d47f61..2a4422228 100644 --- a/src/Modelling/CdOd/Output.hs +++ b/src/Modelling/CdOd/Output.hs @@ -4,7 +4,6 @@ module Modelling.CdOd.Output ( cacheCd, cacheOd, drawCd, - drawOdFromInstance, drawOd, ) where @@ -20,7 +19,6 @@ import Capabilities.Diagrams (MonadDiagrams (lin, renderDiagram)) import Capabilities.Graphviz ( MonadGraphviz (errorWithoutGraphviz, layoutGraph'), ) -import Capabilities.WriteFile (MonadWriteFile (writeToFile)) import Modelling.Auxiliary.Diagrams ( arrowheadDiamond, arrowheadFilledDiamond, @@ -33,7 +31,6 @@ import Modelling.Auxiliary.Diagrams ( veeArrow, ) import Modelling.CdOd.Auxiliary.Util ( - alloyInstanceToOd, emptyArr, underlinedLabel, ) @@ -50,19 +47,13 @@ import Modelling.CdOd.Types ( Od, OmittedDefaultMultiplicities (..), Relationship (..), - anonymiseObjects, calculateThickAnyRelationships, rangeWithDefault, ) import Control.Lens ((.~)) import Control.Monad (guard) -import Control.Monad.Catch (MonadCatch, MonadThrow) -import Control.Monad.Random ( - RandT, - RandomGen, - ) -import Control.Monad.Trans (MonadTrans(lift)) +import Control.Monad.Catch (MonadThrow) import Data.Bifunctor (Bifunctor (bimap, second)) import Data.ByteString (ByteString) import Data.Digest.Pure.SHA (sha1, showDigest) @@ -88,7 +79,6 @@ import Data.GraphViz.Attributes.Complete (Attribute (..), DPoint (..), Label) import Data.Function ((&)) import Data.List (elemIndex) import Data.Maybe (fromJust, fromMaybe, maybeToList) -import Data.Ratio ((%)) import Data.Tuple.Extra (both) import Diagrams.Align (center) import Diagrams.Angle ((@@), cosA, deg, halfTurn) @@ -120,7 +110,6 @@ import Diagrams.TwoD.Arrowheads (lineTail) import Diagrams.TwoD.Attributes (fc, lc) import Diagrams.Util ((#), with) import Graphics.SVGFonts.ReadFont (PreparedFont) -import Language.Alloy.Call (AlloyInstance) relationshipArrow :: CdDrawSettings @@ -358,45 +347,6 @@ drawClass font l (P p) = translate p # lineWidth 0.6 # svgClass "label" -{-| -Parses an Alloy object diagram instance, draws it and saves it to a file. -(the path where it has been stored is returned) --} -drawOdFromInstance - :: (MonadCatch m, MonadDiagrams m, MonadGraphviz m, MonadWriteFile m, RandomGen g) - => AlloyInstance - -- ^ the Alloy object diagram instance - -> Maybe [String] - -- ^ all possible object names, for @ExtendsAnd FieldPlacement@ - -- - -- see 'alloyInstanceToOd' for more details. - -> [String] - -- ^ possible link names - -> Maybe Rational - -- ^ ratio of anonymous objects - -> DirType - -- ^ direction of links - -> Bool - -- ^ whether to print link names - -> FilePath - -- ^ where to store the object diagram - -> RandT g m FilePath -drawOdFromInstance - alloyInstance - possibleClassNames - possibleLinkNames - anonymous - direction - printNames - path - = do - g <- lift $ alloyInstanceToOd possibleClassNames possibleLinkNames alloyInstance - od <- anonymiseObjects (fromMaybe (1 % 3) anonymous) g - lift $ do - renderedOd <- drawOd od Nothing direction printNames - writeToFile path renderedOd - pure path - cacheOd :: (MonadCache m, MonadDiagrams m, MonadGraphviz m, MonadThrow m) => Od diff --git a/test/Modelling/CdOd/OutputSpec.hs b/test/Modelling/CdOd/OutputSpec.hs index 7b2a21347..b658f1860 100644 --- a/test/Modelling/CdOd/OutputSpec.hs +++ b/test/Modelling/CdOd/OutputSpec.hs @@ -13,12 +13,14 @@ import qualified Data.ByteString.Char8 as BS ( ) import Capabilities.Diagrams.IO () import Capabilities.Graphviz.IO () -import Capabilities.WriteFile.IO () -import Modelling.CdOd.Output (drawCd, drawOdFromInstance) -import Modelling.CdOd.Types (defaultCdDrawSettings) +import Modelling.CdOd.Auxiliary.Util (alloyInstanceToOd) +import Modelling.CdOd.Output (drawCd, drawOd) +import Modelling.CdOd.Types ( + anonymiseObjects, + defaultCdDrawSettings, + ) import Modelling.Common (withUnitTestsUsingPath) -import Control.Monad (void) import Control.Monad.Except (runExceptT) import Control.Monad.Random (evalRandT) import Data.GraphViz (DirType (Forward)) @@ -41,23 +43,16 @@ spec = do Deviation {absoluteDeviation = 20, relativeDeviation = 0.2} draws what = "draws roughly the expected " ++ what ++ " diagram" dir = "test/unit/Modelling/CdOd/Output" - drawCdInstance alloy = withTempFile $ \file -> do + drawCdInstance alloy = do Right alloyInstance <- runExceptT $ parseInstance (BS.pack alloy) Right cd <- return $ instanceClassDiagram <$> fromInstance alloyInstance - renderedCd <- drawCd defaultCdDrawSettings mempty Nothing cd - BS.writeFile file renderedCd - BS.readFile file - drawOdInstance alloy = withTempFile $ \file -> do + fileCreationWith $ drawCd defaultCdDrawSettings mempty Nothing cd + drawOdInstance alloy = do Right alloyInstance <- runExceptT $ parseInstance (BS.pack alloy) let possibleLinks = map (: []) ['w'..'y'] - void $ flip evalRandT - (mkStdGen 0) - $ drawOdFromInstance - alloyInstance - Nothing - possibleLinks - (Just 1) - Forward - True - file - BS.readFile file + fileCreationWith $ do + od <- alloyInstanceToOd Nothing possibleLinks alloyInstance + od' <- evalRandT (anonymiseObjects 1 od) $ mkStdGen 0 + drawOd od' Nothing Forward True + fileCreationWith action = withTempFile $ \file -> + action >>= BS.writeFile file >> BS.readFile file