Render hasse diagram v0
This commit is contained in:
parent
d251afe902
commit
93fda85203
59
proto.cabal
59
proto.cabal
@ -1,25 +1,5 @@
|
|||||||
cabal-version: 3.0
|
cabal-version: 3.0
|
||||||
-- The cabal-version field refers to the version of the .cabal specification,
|
|
||||||
-- and can be different from the cabal-install (the tool) version and the
|
|
||||||
-- Cabal (the library) version you are using. As such, the Cabal (the library)
|
|
||||||
-- version used must be equal or greater than the version stated in this field.
|
|
||||||
-- Starting from the specification version 2.2, the cabal-version field must be
|
|
||||||
-- the first thing in the cabal file.
|
|
||||||
|
|
||||||
-- Initial package description 'proto' generated by
|
|
||||||
-- 'cabal init'. For further documentation, see:
|
|
||||||
-- http://haskell.org/cabal/users-guide/
|
|
||||||
--
|
|
||||||
-- The name of the package.
|
|
||||||
name: proto
|
name: proto
|
||||||
|
|
||||||
-- The package version.
|
|
||||||
-- See the Haskell package versioning policy (PVP) for standards
|
|
||||||
-- guiding when and how versions should be incremented.
|
|
||||||
-- https://pvp.haskell.org
|
|
||||||
-- PVP summary: +-+------- breaking API changes
|
|
||||||
-- | | +----- non-breaking API additions
|
|
||||||
-- | | | +--- code changes with no API change
|
|
||||||
version: 0.1.0.0
|
version: 0.1.0.0
|
||||||
|
|
||||||
-- A short (one-line) description of the package.
|
-- A short (one-line) description of the package.
|
||||||
@ -28,55 +8,42 @@ version: 0.1.0.0
|
|||||||
-- A longer description of the package.
|
-- A longer description of the package.
|
||||||
-- description:
|
-- description:
|
||||||
|
|
||||||
-- The license under which the package is released.
|
|
||||||
license: BSD-3-Clause
|
license: BSD-3-Clause
|
||||||
|
|
||||||
-- The file containing the license text.
|
|
||||||
license-file: LICENSE
|
license-file: LICENSE
|
||||||
|
author: Ali Abrar, Cale Gibbard, Obsidian Systems
|
||||||
-- The package author(s).
|
|
||||||
author: Obsidian Systems
|
|
||||||
|
|
||||||
-- An email address to which users can send suggestions, bug reports, and patches.
|
|
||||||
maintainer: maintainer@obsidian.systems
|
maintainer: maintainer@obsidian.systems
|
||||||
|
copyright: 2025 Obsidian Systems
|
||||||
-- A copyright notice.
|
|
||||||
-- copyright:
|
|
||||||
build-type: Simple
|
build-type: Simple
|
||||||
|
|
||||||
-- Extra doc files to be distributed with the package, such as a CHANGELOG or a README.
|
|
||||||
extra-doc-files: CHANGELOG.md
|
extra-doc-files: CHANGELOG.md
|
||||||
|
|
||||||
-- Extra source files to be distributed with the package, such as examples, or a tutorial module.
|
|
||||||
-- extra-source-files:
|
|
||||||
|
|
||||||
common warnings
|
common warnings
|
||||||
ghc-options: -Wall
|
ghc-options: -Wall
|
||||||
|
|
||||||
library
|
library
|
||||||
-- Import common warning flags.
|
|
||||||
import: warnings
|
import: warnings
|
||||||
|
|
||||||
-- Modules exported by the library.
|
exposed-modules:
|
||||||
exposed-modules: Diagram
|
Diagram
|
||||||
|
Diagram.Hasse
|
||||||
|
|
||||||
-- Modules included in this library but not exported.
|
|
||||||
-- other-modules:
|
|
||||||
|
|
||||||
-- LANGUAGE extensions used by modules in this package.
|
|
||||||
default-extensions:
|
default-extensions:
|
||||||
|
FlexibleContexts
|
||||||
ImportQualifiedPost
|
ImportQualifiedPost
|
||||||
LambdaCase
|
LambdaCase
|
||||||
RankNTypes
|
RankNTypes
|
||||||
|
ScopedTypeVariables
|
||||||
|
TypeOperators
|
||||||
|
|
||||||
-- Other library packages from which modules are imported.
|
|
||||||
build-depends: base ^>=4.19.2.0
|
build-depends: base ^>=4.19.2.0
|
||||||
, containers
|
, containers
|
||||||
, semialign
|
, semialign
|
||||||
, these
|
, these
|
||||||
|
, colour
|
||||||
|
, diagrams-contrib
|
||||||
|
, diagrams-core
|
||||||
|
, diagrams-lib
|
||||||
|
, diagrams-svg
|
||||||
|
|
||||||
-- Directories containing source files.
|
|
||||||
hs-source-dirs: src
|
hs-source-dirs: src
|
||||||
|
|
||||||
-- Base language which the package is written in.
|
|
||||||
default-language: Haskell2010
|
default-language: Haskell2010
|
||||||
|
@ -1,9 +1,13 @@
|
|||||||
module Diagram
|
module Diagram
|
||||||
( Polarity(..)
|
( Polarity(..)
|
||||||
, Diagram
|
, Diagram
|
||||||
|
, _diagram_grades
|
||||||
|
, _diagram_down
|
||||||
|
, _diagram_up
|
||||||
, empty
|
, empty
|
||||||
, insert
|
, insert
|
||||||
, InsertError(..)
|
, InsertError(..)
|
||||||
|
, verticesByGrade
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Control.Monad
|
import Control.Monad
|
||||||
@ -76,3 +80,7 @@ insert vtx grade down d = do
|
|||||||
That _ -> Left $ InsertError_UnknownDownVertex k
|
That _ -> Left $ InsertError_UnknownDownVertex k
|
||||||
These g _ | g == grade-1 -> pure ()
|
These g _ | g == grade-1 -> pure ()
|
||||||
These _ _ -> Left $ InsertError_DownVertexUnreachable k
|
These _ _ -> Left $ InsertError_DownVertexUnreachable k
|
||||||
|
|
||||||
|
verticesByGrade :: Ord vtx => Diagram vtx -> Map Int (Set vtx)
|
||||||
|
verticesByGrade (Diagram grades _ _) =
|
||||||
|
Map.fromListWith Set.union [ (grade, Set.singleton vtx) | (vtx, grade) <- Map.toList grades ]
|
||||||
|
55
src/Diagram/Hasse.hs
Normal file
55
src/Diagram/Hasse.hs
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
module Diagram.Hasse where
|
||||||
|
|
||||||
|
import Control.Monad
|
||||||
|
import Data.Map qualified as Map
|
||||||
|
import Data.Maybe
|
||||||
|
import Data.Set qualified as Set
|
||||||
|
import Diagram qualified as D
|
||||||
|
import Diagrams.Backend.SVG.CmdLine
|
||||||
|
import Diagrams.Prelude
|
||||||
|
import Diagrams.TwoD
|
||||||
|
|
||||||
|
colors :: [Colour Double]
|
||||||
|
colors = map sRGB24read["#000000", "#D1DBBD", "#91AA9D", "#3E606F", "#193441", "#000000"]
|
||||||
|
|
||||||
|
hasseRow :: (V c ~ V2, Alignable c, HasOrigin c, Floating (N c), Juxtaposable c, Monoid' c) => (a -> c) -> [a] -> c
|
||||||
|
hasseRow f = centerX . hcat' (with & sep .~ 2) . map f
|
||||||
|
|
||||||
|
hasseDiagram
|
||||||
|
:: forall vtx. (IsName vtx, Ord vtx)
|
||||||
|
=> (vtx -> QDiagram B V2 Double Any)
|
||||||
|
-> D.Diagram vtx
|
||||||
|
-> QDiagram B V2 Double Any
|
||||||
|
hasseDiagram f d = centerXY $ drawConnections setsD
|
||||||
|
where
|
||||||
|
setsD = vcat' (with & sep .~ fromIntegral n)
|
||||||
|
. map (hasseRow f)
|
||||||
|
. reverse
|
||||||
|
$ subsets
|
||||||
|
grades = D.verticesByGrade d
|
||||||
|
subsets :: [[vtx]] = fmap (Set.toList . snd) $ Map.toList grades
|
||||||
|
n :: Int = maximum $ Map.keys grades
|
||||||
|
drawConnections = applyAll connections
|
||||||
|
connections = concat $ zipWith connectSome subsets (tail subsets)
|
||||||
|
connectSome subs1 subs2 =
|
||||||
|
[ connect p s1 s2
|
||||||
|
| s1 <- subs1
|
||||||
|
, s2 <- subs2
|
||||||
|
, p <- maybeToList $ Map.lookup s1 <=< Map.lookup s2 $ D._diagram_down d
|
||||||
|
]
|
||||||
|
connect p v1 v2 =
|
||||||
|
withNames [v1, v2] $ \[b1, b2] ->
|
||||||
|
beneath (boundaryFrom b1 unitY ~~ boundaryFrom b2 unit_Y) # polarity p # lw thick
|
||||||
|
|
||||||
|
polarity p = lc $ case p of
|
||||||
|
D.Positive -> red
|
||||||
|
D.Negative -> blue
|
||||||
|
|
||||||
|
c x = named x $ text (show x) <> (unitSquare # lc black # fc grey # lw thin)
|
||||||
|
|
||||||
|
Right (x :: D.Diagram Int) = D.insert 3 1 (Map.fromList [(1, D.Negative), (2, D.Positive)]) =<< D.insert 2 0 mempty =<< D.insert 1 0 mempty D.empty
|
||||||
|
|
||||||
|
example = scale 100 $ pad 1.1 $ hasseDiagram c x
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
main = mainWith (example :: Diagram B)
|
Loading…
x
Reference in New Issue
Block a user