{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Miso.Data.Set
(
Set
, new
, fromList
, insert
, member
, clear
, size
, delete
, union
, intersection
, difference
, isSubset
, isSuperset
, isDisjoint
) where
import Control.Monad (void, forM_)
import Prelude hiding (lookup)
import Miso.DSL (jsg, JSVal, ToJSVal, FromJSVal, (!))
import qualified Miso.DSL as DSL
import Miso.FFI (callFunction)
newtype Set key = Set JSVal deriving (JSVal -> IO (Maybe (Set key))
JSVal -> IO (Set key)
(JSVal -> IO (Maybe (Set key)))
-> (JSVal -> IO (Set key)) -> FromJSVal (Set key)
forall key. JSVal -> IO (Maybe (Set key))
forall key. JSVal -> IO (Set key)
forall a. (JSVal -> IO (Maybe a)) -> (JSVal -> IO a) -> FromJSVal a
$cfromJSVal :: forall key. JSVal -> IO (Maybe (Set key))
fromJSVal :: JSVal -> IO (Maybe (Set key))
$cfromJSValUnchecked :: forall key. JSVal -> IO (Set key)
fromJSValUnchecked :: JSVal -> IO (Set key)
FromJSVal, Set key -> IO JSVal
(Set key -> IO JSVal) -> ToJSVal (Set key)
forall key. Set key -> IO JSVal
forall a. (a -> IO JSVal) -> ToJSVal a
$ctoJSVal :: forall key. Set key -> IO JSVal
toJSVal :: Set key -> IO JSVal
ToJSVal)
new :: IO (Set key)
new :: forall key. IO (Set key)
new = JSVal -> Set key
forall key. JSVal -> Set key
Set (JSVal -> Set key) -> IO JSVal -> IO (Set key)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO JSVal -> [JSVal] -> IO JSVal
forall constructor args.
(ToObject constructor, ToArgs args) =>
constructor -> args -> IO JSVal
DSL.new (MisoString -> IO JSVal
jsg MisoString
"Set") ([] :: [JSVal])
insert :: ToJSVal key => key -> Set key -> IO ()
insert :: forall key. ToJSVal key => key -> Set key -> IO ()
insert key
key (Set JSVal
m) = do
_ <- JSVal -> MisoString -> [key] -> IO JSVal
forall args. ToArgs args => JSVal -> MisoString -> args -> IO JSVal
callFunction JSVal
m MisoString
"add" [key
key]
pure ()
clear :: Set key -> IO ()
clear :: forall key. Set key -> IO ()
clear (Set JSVal
m) = IO JSVal -> IO ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (JSVal -> MisoString -> () -> IO JSVal
forall args. ToArgs args => JSVal -> MisoString -> args -> IO JSVal
callFunction JSVal
m MisoString
"clear" ())
size :: Set key -> IO Int
size :: forall key. Set key -> IO Int
size (Set JSVal
m) = JSVal -> IO Int
forall a. FromJSVal a => JSVal -> IO a
DSL.fromJSValUnchecked (JSVal -> IO Int) -> IO JSVal -> IO Int
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< JSVal
m JSVal -> MisoString -> IO JSVal
forall o. ToObject o => o -> MisoString -> IO JSVal
! MisoString
"size"
member :: ToJSVal key => key -> Set key -> IO Bool
member :: forall key. ToJSVal key => key -> Set key -> IO Bool
member key
key (Set JSVal
m) = JSVal -> IO Bool
forall a. FromJSVal a => JSVal -> IO a
DSL.fromJSValUnchecked (JSVal -> IO Bool) -> IO JSVal -> IO Bool
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< JSVal -> MisoString -> JSVal -> IO JSVal
forall args. ToArgs args => JSVal -> MisoString -> args -> IO JSVal
callFunction JSVal
m MisoString
"has" (JSVal -> IO JSVal) -> IO JSVal -> IO JSVal
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< key -> IO JSVal
forall a. ToJSVal a => a -> IO JSVal
DSL.toJSVal key
key
delete :: ToJSVal key => key -> Set key -> IO Bool
delete :: forall key. ToJSVal key => key -> Set key -> IO Bool
delete key
key (Set JSVal
m) = JSVal -> IO Bool
forall a. FromJSVal a => JSVal -> IO a
DSL.fromJSValUnchecked (JSVal -> IO Bool) -> IO JSVal -> IO Bool
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< JSVal -> MisoString -> JSVal -> IO JSVal
forall args. ToArgs args => JSVal -> MisoString -> args -> IO JSVal
callFunction JSVal
m MisoString
"delete" (JSVal -> IO JSVal) -> IO JSVal -> IO JSVal
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< key -> IO JSVal
forall a. ToJSVal a => a -> IO JSVal
DSL.toJSVal key
key
fromList :: ToJSVal key => [key] -> IO (Set key)
fromList :: forall key. ToJSVal key => [key] -> IO (Set key)
fromList [key]
xs = do
m <- IO (Set key)
forall key. IO (Set key)
new
forM_ xs $ \key
k ->
key -> Set key -> IO ()
forall key. ToJSVal key => key -> Set key -> IO ()
insert key
k Set key
m
pure m
union :: ToJSVal key => Set key -> Set key -> IO (Set key)
union :: forall key. ToJSVal key => Set key -> Set key -> IO (Set key)
union (Set JSVal
x) (Set JSVal
y) = JSVal -> Set key
forall key. JSVal -> Set key
Set (JSVal -> Set key) -> IO JSVal -> IO (Set key)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> JSVal -> MisoString -> [JSVal] -> IO JSVal
forall args. ToArgs args => JSVal -> MisoString -> args -> IO JSVal
callFunction JSVal
x MisoString
"union" [JSVal
y]
intersection :: ToJSVal key => Set key -> Set key -> IO (Set key)
intersection :: forall key. ToJSVal key => Set key -> Set key -> IO (Set key)
intersection (Set JSVal
x) (Set JSVal
y) = JSVal -> Set key
forall key. JSVal -> Set key
Set (JSVal -> Set key) -> IO JSVal -> IO (Set key)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> JSVal -> MisoString -> [JSVal] -> IO JSVal
forall args. ToArgs args => JSVal -> MisoString -> args -> IO JSVal
callFunction JSVal
x MisoString
"intersection" [JSVal
y]
difference :: ToJSVal key => Set key -> Set key -> IO (Set key)
difference :: forall key. ToJSVal key => Set key -> Set key -> IO (Set key)
difference (Set JSVal
x) (Set JSVal
y) = JSVal -> Set key
forall key. JSVal -> Set key
Set (JSVal -> Set key) -> IO JSVal -> IO (Set key)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> JSVal -> MisoString -> [JSVal] -> IO JSVal
forall args. ToArgs args => JSVal -> MisoString -> args -> IO JSVal
callFunction JSVal
x MisoString
"symmetricDifference" [JSVal
y]
isSubset :: ToJSVal key => Set key -> Set key -> IO Bool
isSubset :: forall key. ToJSVal key => Set key -> Set key -> IO Bool
isSubset (Set JSVal
x) (Set JSVal
y) = JSVal -> IO Bool
forall a. FromJSVal a => JSVal -> IO a
DSL.fromJSValUnchecked (JSVal -> IO Bool) -> IO JSVal -> IO Bool
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<
JSVal -> MisoString -> [JSVal] -> IO JSVal
forall args. ToArgs args => JSVal -> MisoString -> args -> IO JSVal
callFunction JSVal
x MisoString
"isSubsetOf" [JSVal
y]
isSuperset :: ToJSVal key => Set key -> Set key -> IO Bool
isSuperset :: forall key. ToJSVal key => Set key -> Set key -> IO Bool
isSuperset (Set JSVal
x) (Set JSVal
y) = JSVal -> IO Bool
forall a. FromJSVal a => JSVal -> IO a
DSL.fromJSValUnchecked (JSVal -> IO Bool) -> IO JSVal -> IO Bool
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<
JSVal -> MisoString -> [JSVal] -> IO JSVal
forall args. ToArgs args => JSVal -> MisoString -> args -> IO JSVal
callFunction JSVal
x MisoString
"isSupersetOf" [JSVal
y]
isDisjoint :: ToJSVal key => Set key -> Set key -> IO Bool
isDisjoint :: forall key. ToJSVal key => Set key -> Set key -> IO Bool
isDisjoint (Set JSVal
x) (Set JSVal
y) = JSVal -> IO Bool
forall a. FromJSVal a => JSVal -> IO a
DSL.fromJSValUnchecked (JSVal -> IO Bool) -> IO JSVal -> IO Bool
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<
JSVal -> MisoString -> [JSVal] -> IO JSVal
forall args. ToArgs args => JSVal -> MisoString -> args -> IO JSVal
callFunction JSVal
x MisoString
"isDisjointFrom" [JSVal
y]