module Complex
( Generator(..),
Sign(..),
signToNum,
AlgGen(..),
wrapGen,
toSet,
Morphisms,
addMod2,
addMod2Set,
addMod2Map,
addToKey,
fromTo )
where
import Braids
import Data.Set (Set)
import qualified Data.Set as S
import Data.Map (Map, (!))
import qualified Data.Map as M
import Data.Monoid
data Generator = Generator { resolution :: Resolution
, components :: Set Component
, signs :: Map Component Sign
, kgrade :: Int}
deriving (Eq, Ord, Show)
data Sign = Plus | Minus deriving (Eq, Show, Ord)
signToNum :: Sign -> Int
signToNum Plus = 1
signToNum Minus = (1)
newtype AlgGen = AlgGen (Set Generator) deriving (Show, Ord, Eq)
wrapGen :: Generator -> AlgGen
wrapGen = AlgGen . S.singleton
toSet :: AlgGen -> Set Generator
toSet (AlgGen s) = s
instance Monoid AlgGen where
mempty = AlgGen S.empty
mappend (AlgGen s) (AlgGen s') = AlgGen (addMod2Set s s')
type Morphisms = Map AlgGen (Set AlgGen)
fromTo :: Set AlgGen -> Set AlgGen -> [(AlgGen, Set AlgGen)]
fromTo s s' = [(x,S.singleton y) | x <- S.toList s, y <- S.toList s']
addMod2 :: (Eq a, Ord a) => a -> Set a -> Set a
addMod2 b set = if S.member b set then S.delete b set else S.insert b set
addMod2Set :: (Eq a, Ord a) => Set a -> Set a -> Set a
addMod2Set bs set = S.foldr addMod2 set bs
addMod2Map :: (Ord a, Ord k) => Map k (Set a) -> Map k (Set a) -> Map k (Set a)
addMod2Map x y = M.filter (not . S.null) (M.unionWith addMod2Set x y)
addToKey :: (Ord k, Monoid k, Monoid a) => k -> k -> Map k a -> Map k a
addToKey x key mors = if key `M.member` mors
then M.insert (x <> key) (mors ! key)
. M.delete key
$ mors
else mors