Skip to content

Instantly share code, notes, and snippets.

@yasuabe
Last active May 12, 2017 13:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yasuabe/b247886116a0a7ec926b0b581a987a73 to your computer and use it in GitHub Desktop.
Save yasuabe/b247886116a0a7ec926b0b581a987a73 to your computer and use it in GitHub Desktop.
haskell implementation of simpath: Border
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