Refactor, try to limit dependencies
This commit is contained in:
+76
-66
@@ -1,48 +1,48 @@
|
||||
module Dodge.RoomLink
|
||||
( muout
|
||||
, muin
|
||||
, outLink
|
||||
, inLink
|
||||
, restrictLinkType
|
||||
, overLnkType
|
||||
, lnkPosDir
|
||||
, overLnkPosDir
|
||||
, toBothLnk
|
||||
, rmInLinks
|
||||
, rmOutLinks
|
||||
, setOutLinksPD
|
||||
, setOutLinksByType
|
||||
, setInLinksPD
|
||||
, restrictOutLinks
|
||||
, restrictInLinks
|
||||
, setOutLinks
|
||||
, setInLinks
|
||||
, setInLinksByType
|
||||
, setLinkType
|
||||
, getLinksOfType
|
||||
, swapInOutLinks
|
||||
) where
|
||||
--import Dodge.LevelGen.Data
|
||||
import Dodge.Data
|
||||
import Geometry
|
||||
module Dodge.RoomLink (
|
||||
muout,
|
||||
muin,
|
||||
outLink,
|
||||
inLink,
|
||||
restrictLinkType,
|
||||
overLnkType,
|
||||
lnkPosDir,
|
||||
overLnkPosDir,
|
||||
toBothLnk,
|
||||
rmInLinks,
|
||||
rmOutLinks,
|
||||
setOutLinksPD,
|
||||
setOutLinksByType,
|
||||
setInLinksPD,
|
||||
restrictOutLinks,
|
||||
restrictInLinks,
|
||||
setOutLinks,
|
||||
setInLinks,
|
||||
setInLinksByType,
|
||||
setLinkType,
|
||||
getLinksOfType,
|
||||
swapInOutLinks,
|
||||
) where
|
||||
|
||||
import Control.Lens
|
||||
import Data.List (partition)
|
||||
import qualified Data.Set as S
|
||||
import Control.Lens
|
||||
import Dodge.Data.GenWorld
|
||||
import Geometry
|
||||
|
||||
restrictLinkType :: RoomLinkType -> ((Point2,Float) -> Bool) -> [RoomLink] -> [RoomLink]
|
||||
restrictLinkType :: RoomLinkType -> ((Point2, Float) -> Bool) -> [RoomLink] -> [RoomLink]
|
||||
restrictLinkType rlt f = map g
|
||||
where
|
||||
g rl | f $ rlPosDir rl = rl
|
||||
| otherwise = rl & rlType %~ S.delete rlt
|
||||
g rl
|
||||
| f $ rlPosDir rl = rl
|
||||
| otherwise = rl & rlType %~ S.delete rlt
|
||||
|
||||
getLinksOfType :: RoomLinkType -> [RoomLink] -> [RoomLink]
|
||||
getLinksOfType lt = filter (S.member lt . _rlType)
|
||||
|
||||
restrictInLinks :: ((Point2,Float) -> Bool) -> Room -> Room
|
||||
restrictInLinks :: ((Point2, Float) -> Bool) -> Room -> Room
|
||||
restrictInLinks = over rmLinks . restrictLinkType InLink
|
||||
|
||||
restrictOutLinks :: ((Point2,Float) -> Bool) -> Room -> Room
|
||||
restrictOutLinks :: ((Point2, Float) -> Bool) -> Room -> Room
|
||||
restrictOutLinks f = rmLinks %~ restrictLinkType OutLink f
|
||||
|
||||
setOutLinks :: (RoomLink -> Bool) -> [RoomLink] -> [RoomLink]
|
||||
@@ -60,19 +60,21 @@ setOutLinksByType lt = setOutLinks (\rl -> lt `S.member` _rlType rl)
|
||||
setLinkType :: RoomLinkType -> (RoomLink -> Bool) -> [RoomLink] -> [RoomLink]
|
||||
setLinkType rlt f = map g
|
||||
where
|
||||
g rl | f rl = rl & rlType %~ S.insert rlt
|
||||
| otherwise = rl & rlType %~ S.delete rlt
|
||||
g rl
|
||||
| f rl = rl & rlType %~ S.insert rlt
|
||||
| otherwise = rl & rlType %~ S.delete rlt
|
||||
|
||||
setLinkTypePD :: RoomLinkType -> ((Point2,Float) -> Bool) -> [RoomLink] -> [RoomLink]
|
||||
setLinkTypePD :: RoomLinkType -> ((Point2, Float) -> Bool) -> [RoomLink] -> [RoomLink]
|
||||
setLinkTypePD rlt f = map g
|
||||
where
|
||||
g rl | f $ rlPosDir rl = rl & rlType %~ S.insert rlt
|
||||
| otherwise = rl & rlType %~ S.delete rlt
|
||||
g rl
|
||||
| f $ rlPosDir rl = rl & rlType %~ S.insert rlt
|
||||
| otherwise = rl & rlType %~ S.delete rlt
|
||||
|
||||
setInLinksPD :: ((Point2,Float) -> Bool) -> Room -> Room
|
||||
setInLinksPD :: ((Point2, Float) -> Bool) -> Room -> Room
|
||||
setInLinksPD f = rmLinks %~ setLinkTypePD InLink f
|
||||
|
||||
setOutLinksPD :: ((Point2,Float) -> Bool) -> Room -> Room
|
||||
setOutLinksPD :: ((Point2, Float) -> Bool) -> Room -> Room
|
||||
setOutLinksPD f = rmLinks %~ setLinkTypePD OutLink f
|
||||
|
||||
swapInOutLinks :: Room -> Room
|
||||
@@ -85,46 +87,54 @@ swapInOutLinks = rmLinks %~ map (rlType %~ S.map f)
|
||||
overLnkType :: RoomLinkType -> ([RoomLink] -> [RoomLink]) -> Room -> Room
|
||||
overLnkType lt f = rmLinks %~ g
|
||||
where
|
||||
g lnks = let (xs,ys) = partition (S.member lt . _rlType) lnks
|
||||
in f xs ++ ys
|
||||
g lnks =
|
||||
let (xs, ys) = partition (S.member lt . _rlType) lnks
|
||||
in f xs ++ ys
|
||||
|
||||
rlPosDir :: RoomLink -> (Point2,Float)
|
||||
rlPosDir :: RoomLink -> (Point2, Float)
|
||||
rlPosDir rl = (_rlPos rl, _rlDir rl)
|
||||
|
||||
lnkPosDir :: RoomLink -> (Point2,Float)
|
||||
lnkPosDir :: RoomLink -> (Point2, Float)
|
||||
lnkPosDir rl = (_rlPos rl, _rlDir rl)
|
||||
|
||||
overLnkPosDir :: ((Point2,Float) -> (Point2,Float)) -> RoomLink -> RoomLink
|
||||
overLnkPosDir :: ((Point2, Float) -> (Point2, Float)) -> RoomLink -> RoomLink
|
||||
overLnkPosDir f rl = rl & rlPos .~ p & rlDir .~ a
|
||||
where
|
||||
(p,a) = f (_rlPos rl,_rlDir rl)
|
||||
(p, a) = f (_rlPos rl, _rlDir rl)
|
||||
|
||||
outLink :: Point2 -> Float -> RoomLink
|
||||
outLink p a = RoomLink
|
||||
{_rlType = S.singleton OutLink
|
||||
,_rlPos = p
|
||||
, _rlDir = a
|
||||
}
|
||||
inLink :: Point2 -> Float -> RoomLink
|
||||
inLink p a = RoomLink
|
||||
{_rlType = S.singleton InLink
|
||||
,_rlPos = p
|
||||
, _rlDir = a
|
||||
}
|
||||
outLink p a =
|
||||
RoomLink
|
||||
{ _rlType = S.singleton OutLink
|
||||
, _rlPos = p
|
||||
, _rlDir = a
|
||||
}
|
||||
|
||||
toBothLnk :: (Point2,Float) -> RoomLink
|
||||
toBothLnk (p,a) = RoomLink
|
||||
{ _rlType = S.fromList [OutLink,InLink]
|
||||
, _rlPos = p
|
||||
, _rlDir = a
|
||||
}
|
||||
muout :: [(Point2,Float)] -> [RoomLink]
|
||||
inLink :: Point2 -> Float -> RoomLink
|
||||
inLink p a =
|
||||
RoomLink
|
||||
{ _rlType = S.singleton InLink
|
||||
, _rlPos = p
|
||||
, _rlDir = a
|
||||
}
|
||||
|
||||
toBothLnk :: (Point2, Float) -> RoomLink
|
||||
toBothLnk (p, a) =
|
||||
RoomLink
|
||||
{ _rlType = S.fromList [OutLink, InLink]
|
||||
, _rlPos = p
|
||||
, _rlDir = a
|
||||
}
|
||||
|
||||
muout :: [(Point2, Float)] -> [RoomLink]
|
||||
muout = map (uncurry outLink)
|
||||
muin :: [(Point2,Float)] -> [RoomLink]
|
||||
|
||||
muin :: [(Point2, Float)] -> [RoomLink]
|
||||
muin = map (uncurry inLink)
|
||||
|
||||
rmLinksOfType :: RoomLinkType -> Room -> [RoomLink]
|
||||
rmLinksOfType lt = filter (S.member lt . _rlType) . _rmLinks
|
||||
rmOutLinks,rmInLinks :: Room -> [RoomLink]
|
||||
|
||||
rmOutLinks, rmInLinks :: Room -> [RoomLink]
|
||||
rmOutLinks = rmLinksOfType OutLink
|
||||
rmInLinks = rmLinksOfType InLink
|
||||
|
||||
Reference in New Issue
Block a user