Skip to content

Instantly share code, notes, and snippets.

@LeviSchuck
Created January 14, 2017 02:16
Show Gist options
  • Save LeviSchuck/c34c58c295806bc23fffe82ee19e52b5 to your computer and use it in GitHub Desktop.
Save LeviSchuck/c34c58c295806bc23fffe82ee19e52b5 to your computer and use it in GitHub Desktop.
import Prelude((<),(+),(-),($))
import qualified Prelude as P
import qualified Data.List as L
import qualified Data.Set as S
data Event = Add | Remove deriving (P.Eq,P.Ord,P.Show)
events li = L.sort $ L.concat $ L.map (\(x,y,k) -> [(x,Add,k),(y,Remove,k)]) li
process ((st,stv,stk):events) = L.map (\(a,b,c) -> (a, b, S.toList c)) $ L.reverse res
where (_,_,res) = L.foldl step (S.singleton stk,st,[]) events
step (active, startTime, res) (time, ev, evk) = (next, nextTime, expected)
where
endTime = case ev of
Add -> time - 1
Remove -> time
next = case ev of
Add -> S.insert evk active
Remove -> S.delete evk active
expected = if startTime < endTime
then (startTime, endTime, active) : res
else res
nextTime = endTime + 1
skipList =
[ (100, 200, 'A')
, (201, 300, 'B')
, ( 20, 400, 'C')
, (125, 150, 'D')
, (151, 250, 'E')
]
expected =
[ ( 20, 99, ['C'])
, (100, 124, ['A','C'])
, (125, 150, ['A','C','D'])
, (151, 200, ['A','C','E'])
, (201, 250, ['B','C','E'])
, (251, 300, ['B','C'])
, (301, 400, ['C'])
]
calculated = process $ events $ skipList
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment