Last active
May 12, 2017 13:00
-
-
Save yasuabe/b247886116a0a7ec926b0b581a987a73 to your computer and use it in GitHub Desktop.
haskell implementation of simpath: Border
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module Simpath.Border where | |
import Control.Monad.State (State, get, put, evalState) | |
import Simpath.Common | |
import Simpath.Edge | |
import Data.Set (Set) | |
import qualified Data.Set as Set | |
data Border = Border { edge :: Edge, done :: Maybe Int } deriving (Show) | |
borders :: [Edge] -> [Border] | |
borders es = reverse $ evalState bordersState Set.empty | |
where | |
bordersState = sequence $ map fromEdge $ reverse es | |
fromEdge :: Edge -> State (Set Int) Border | |
fromEdge e@(Edge l _) = do used <- get | |
put $ Set.insert l used | |
return $ Border e $ justIf (Set.notMember l used) l |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment