packages feed

fearOfView-0.2.0.0: Fov.hs

module Fov where

import qualified Data.Set as S

import           Group
import qualified Pos      as P

data Fov = Fov { pFov :: S.Set P.Pos, wpFov :: S.Set P.WPos }
    deriving Eq

empty :: Fov
empty = Fov S.empty S.empty

null :: Fov -> Bool
null (Fov ps wps) = S.null ps && S.null wps

unions :: [Fov] -> Fov
unions fovs = Fov (S.unions $ pFov <$> fovs) (S.unions $ wpFov <$> fovs)

union :: Fov -> Fov -> Fov
union a b = unions [a,b]

intersection :: Fov -> Fov -> Fov
intersection (Fov ps wps) (Fov ps' wps') = Fov (ps `S.intersection` ps') (wps `S.intersection` wps')

filter :: (P.Pos -> Bool) -> (P.WPos -> Bool) -> Fov -> Fov
filter pf wpf (Fov ps wps) = Fov (S.filter pf ps) (S.filter wpf wps)

map :: (P.Pos -> P.Pos) -> (P.WPos -> P.WPos) -> Fov -> Fov
map pf wpf (Fov ps wps) = Fov (pf `S.map` ps) (wpf `S.map` wps)

(\\) :: Fov -> Fov -> Fov
(Fov ps wps) \\ (Fov ps' wps') = Fov (ps S.\\ ps') (wps S.\\ wps')

rebase :: P.Pos -> Fov -> Fov
rebase v (Fov ps wps) = Fov ((v +^) `S.map` ps) ((v +^) `S.map` wps)

insertP :: P.Pos -> Fov -> Fov
insertP p (Fov ps wps) = Fov (S.insert p ps) wps