@@ -6,6 +6,7 @@ module Foreign
66 , ForeignError (..)
77 , MultipleErrors (..)
88 , F
9+ , FT
910 , renderForeignError
1011 , unsafeToForeign
1112 , unsafeFromForeign
@@ -29,7 +30,7 @@ module Foreign
2930
3031import Prelude
3132
32- import Control.Monad.Except (Except , throwError , mapExcept )
33+ import Control.Monad.Except (Except , ExceptT , mapExceptT , throwError )
3334import Data.Either (Either (..), either )
3435import Data.Int as Int
3536import Data.List.NonEmpty (NonEmptyList )
@@ -81,6 +82,7 @@ renderForeignError (TypeMismatch exp act) = "Type mismatch: expected " <> exp <>
8182-- | The `Alt` instance for `Except` allows us to accumulate errors,
8283-- | unlike `Either`, which preserves only the last error.
8384type F = Except MultipleErrors
85+ type FT = ExceptT MultipleErrors
8486
8587-- | Coerce any value to the a `Foreign` value.
8688-- |
@@ -105,7 +107,7 @@ foreign import tagOf :: Foreign -> String
105107
106108-- | Unsafely coerce a `Foreign` value when the value has a particular `tagOf`
107109-- | value.
108- unsafeReadTagged :: forall a . String -> Foreign -> F a
110+ unsafeReadTagged :: forall m a . Monad m => String -> Foreign -> FT m a
109111unsafeReadTagged tag value
110112 | tagOf value == tag = pure (unsafeFromForeign value)
111113 | otherwise = fail $ TypeMismatch tag (tagOf value)
@@ -120,52 +122,52 @@ foreign import isUndefined :: Foreign -> Boolean
120122foreign import isArray :: Foreign -> Boolean
121123
122124-- | Attempt to coerce a foreign value to a `String`.
123- readString :: Foreign -> F String
125+ readString :: forall m . Monad m => Foreign -> FT m String
124126readString = unsafeReadTagged " String"
125127
126128-- | Attempt to coerce a foreign value to a `Char`.
127- readChar :: Foreign -> F Char
128- readChar value = mapExcept ( either (const error) fromString) (readString value)
129+ readChar :: forall m . Monad m => Foreign -> FT m Char
130+ readChar value = mapExceptT (map $ either (const error) fromString) (readString value)
129131 where
130132 fromString = maybe error pure <<< toChar
131133 error = Left $ NEL .singleton $ TypeMismatch " Char" (tagOf value)
132134
133135-- | Attempt to coerce a foreign value to a `Boolean`.
134- readBoolean :: Foreign -> F Boolean
136+ readBoolean :: forall m . Monad m => Foreign -> FT m Boolean
135137readBoolean = unsafeReadTagged " Boolean"
136138
137139-- | Attempt to coerce a foreign value to a `Number`.
138- readNumber :: Foreign -> F Number
140+ readNumber :: forall m . Monad m => Foreign -> FT m Number
139141readNumber = unsafeReadTagged " Number"
140142
141143-- | Attempt to coerce a foreign value to an `Int`.
142- readInt :: Foreign -> F Int
143- readInt value = mapExcept ( either (const error) fromNumber) (readNumber value)
144+ readInt :: forall m . Monad m => Foreign -> FT m Int
145+ readInt value = mapExceptT (map $ either (const error) fromNumber) (readNumber value)
144146 where
145147 fromNumber = maybe error pure <<< Int .fromNumber
146148 error = Left $ NEL .singleton $ TypeMismatch " Int" (tagOf value)
147149
148150-- | Attempt to coerce a foreign value to an array.
149- readArray :: Foreign -> F (Array Foreign )
151+ readArray :: forall m . Monad m => Foreign -> FT m (Array Foreign )
150152readArray value
151153 | isArray value = pure $ unsafeFromForeign value
152154 | otherwise = fail $ TypeMismatch " array" (tagOf value)
153155
154- readNull :: Foreign -> F (Maybe Foreign )
156+ readNull :: forall m . Monad m => Foreign -> FT m (Maybe Foreign )
155157readNull value
156158 | isNull value = pure Nothing
157159 | otherwise = pure (Just value)
158160
159- readUndefined :: Foreign -> F (Maybe Foreign )
161+ readUndefined :: forall m . Monad m => Foreign -> FT m (Maybe Foreign )
160162readUndefined value
161163 | isUndefined value = pure Nothing
162164 | otherwise = pure (Just value)
163165
164- readNullOrUndefined :: Foreign -> F (Maybe Foreign )
166+ readNullOrUndefined :: forall m . Monad m => Foreign -> FT m (Maybe Foreign )
165167readNullOrUndefined value
166168 | isNull value || isUndefined value = pure Nothing
167169 | otherwise = pure (Just value)
168170
169- -- | Throws a failure error in `F `.
170- fail :: forall a . ForeignError -> F a
171+ -- | Throws a failure error in `FT `.
172+ fail :: forall m a . Monad m => ForeignError -> FT m a
171173fail = throwError <<< NEL .singleton
0 commit comments