@@ -3,6 +3,7 @@ module Foreign.Generic.Class where
33import Prelude
44
55import Control.Alt ((<|>))
6+ import Control.Bind (bindFlipped )
67import Control.Monad.Except (except , mapExcept )
78import Data.Array ((..), zipWith , length )
89import Data.Bifunctor (lmap )
@@ -14,6 +15,8 @@ import Data.List (List(..), (:))
1415import Data.List as List
1516import Data.Maybe (Maybe (..), maybe )
1617import Data.Newtype (unwrap )
18+ import Data.Set (Set )
19+ import Data.Set as Set
1720import Data.Symbol (class IsSymbol , SProxy (..), reflectSymbol )
1821import Data.Traversable (sequence )
1922import Data.Tuple (Tuple (..))
@@ -135,6 +138,15 @@ instance arrayDecode :: Decode a => Decode (Array a) where
135138 readElement :: Int -> Foreign -> F a
136139 readElement i value = mapExcept (lmap (map (ErrorAtIndex i))) (decode value)
137140
141+ instance setDecode :: (Decode a , Ord a ) => Decode (Set a ) where
142+ decode = (decode :: _ -> F (Array a )) >>> bindFlipped arrayToSetNoDuplicates
143+ where
144+ arrayToSetNoDuplicates :: Array a -> F (Set a )
145+ arrayToSetNoDuplicates array = case Set .fromFoldable array of
146+ set
147+ | length array == Set .size set -> pure set
148+ _ -> except $ Left $ pure $ ForeignError " Decode set: The foreign value contains duplicates"
149+
138150instance maybeDecode :: Decode a => Decode (Maybe a ) where
139151 decode = readNullOrUndefined decode
140152
@@ -192,6 +204,9 @@ instance identityEncode :: Encode a => Encode (Identity a) where
192204instance arrayEncode :: Encode a => Encode (Array a ) where
193205 encode = unsafeToForeign <<< map encode
194206
207+ instance setEncode :: (Encode a , Ord a ) => Encode (Set a ) where
208+ encode = (Set .toUnfoldable :: Set a -> Array a ) >>> encode
209+
195210instance maybeEncode :: Encode a => Encode (Maybe a ) where
196211 encode = maybe null encode
197212
0 commit comments