purescript-0.15.0: tests/purs/passing/3558-UpToDateDictsForHigherOrderFns.purs
module Main where
import Prelude (Unit)
import Effect (Effect)
import Effect.Console (log)
import Record.Unsafe (unsafeGet)
import Type.Data.Symbol (class IsSymbol, reflectSymbol)
import Type.Row (class Cons) as Row
import Type.Proxy (Proxy)
newtype LBox row a = LBox (∀ r. (∀ lbl _1. Row.Cons lbl a _1 row ⇒ IsSymbol lbl ⇒ Proxy lbl → r) → r)
unLBox ∷ ∀ row a r. (∀ lbl _1. Row.Cons lbl a _1 row ⇒ IsSymbol lbl ⇒ Proxy lbl → r) → LBox row a → r
unLBox g (LBox f) = f g
-- Example 1
lboxIdentity ∷ ∀ row a. LBox row a → LBox row a
lboxIdentity = unLBox \lbl → LBox \f → f lbl
-- Example 2
read ∷ ∀ row a. Record row → LBox row a → a
read rec = unLBox \lbl → get lbl rec
get
:: forall r r' l a
. IsSymbol l
=> Row.Cons l a r' r
=> Proxy l
-> Record r
-> a
get l r = unsafeGet (reflectSymbol l) r
main :: Effect Unit
main = log "Done"