Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add roles declarations to allow safe coercions #128

Open
wants to merge 2 commits into
base: ps-0.14
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 11 additions & 1 deletion src/React/Basic.purs
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,9 @@ foreign import createComponent
-- | identify the component. It receives the `ComponentSpec` as a prop and knows
-- | how to defer behavior to it. It requires very specific props and is not useful by
-- | itself from JavaScript. For JavaScript interop, see `toReactComponent`.__
data Component props
foreign import data Component :: Type -> Type

type role Component representational

-- | `Self` represents the component instance at a particular point in time.
-- |
Expand Down Expand Up @@ -347,14 +349,20 @@ foreign import displayNameFromSelf
-- | __*See also:* `element`, `toReactComponent`__
foreign import data ReactComponent :: Type -> Type

type role ReactComponent representational

-- | An opaque representation of a React component's instance (`this` in the JavaScript
-- | React paradigm). It exists as an escape hatch to unsafe behavior. Use it with
-- | caution.
foreign import data ReactComponentInstance :: Type -> Type -> Type

type role ReactComponentInstance representational representational

-- | A React Ref, as created by `React.createRef`
foreign import data Ref :: Type -> Type

type role Ref representational

-- | Convert a React-Basic `ComponentSpec` to a JavaScript-friendly React component.
-- | This function should only be used for JS interop and not normal React-Basic usage.
-- |
Expand All @@ -374,6 +382,8 @@ foreign import toReactComponent

foreign import data ReactContext :: Type -> Type

type role ReactContext representational

-- | Create a `ReactContext` given a default value. Use `provider` and `consumer`
-- | to provide and consume context values. Alternatively, use `contextProvider`
-- | and `contextConsumer` directly if a `ReactComponent` is required for interop.
Expand Down
4 changes: 2 additions & 2 deletions src/React/Basic/Events.purs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import Data.Symbol (class IsSymbol, SProxy(SProxy))
import Effect (Effect)
import Effect.Uncurried (EffectFn1, mkEffectFn1)
import Prim.Row as Row
import Prim.RowList (kind RowList, class RowToList, Cons, Nil)
import Prim.RowList (class RowToList, RowList, Cons, Nil)
import Record (delete, get, insert)
import Type.Data.RowList (RLProxy(..))

Expand Down Expand Up @@ -77,7 +77,7 @@ handler_ = mkEffectFn1 <<< const
syntheticEvent :: EventFn SyntheticEvent SyntheticEvent
syntheticEvent = identity

class Merge (rl :: RowList) fns a r | rl -> fns, rl a -> r where
class Merge (rl :: RowList Type) fns a r | rl -> fns, rl a -> r where
mergeImpl :: RLProxy rl -> Record fns -> EventFn a (Record r)

instance mergeNil :: Merge Nil () a () where
Expand Down