|
| 1 | +module Test.PolymorphicFields where |
| 2 | + |
| 3 | +import Prelude |
| 4 | + |
| 5 | +import Data.Array (catMaybes) |
| 6 | +import Data.Maybe (Maybe(..)) |
| 7 | +import Data.Newtype (unwrap) |
| 8 | +import Data.Undefined.NoProblem (Opt, Req(..), toMaybe) |
| 9 | +import Data.Undefined.NoProblem.Closed as Closed |
| 10 | +import Data.Undefined.NoProblem.Open as Open |
| 11 | +import Effect (Effect) |
| 12 | +import Test.Assert (assert) |
| 13 | + |
| 14 | +type Args a = { x :: Req a, y :: Opt a, z :: Int } |
| 15 | + |
| 16 | +closedConsumer :: forall args a. Closed.Coerce args (Args a) => Show a => args -> String |
| 17 | +closedConsumer args' = show $ catMaybes [Just (unwrap args.x), toMaybe args.y] |
| 18 | + where |
| 19 | + args = Closed.coerce args' :: Args a |
| 20 | + |
| 21 | +openConsumer :: forall args a. Open.Coerce args (Args a) => Show a => args -> String |
| 22 | +openConsumer args' = show $ catMaybes [Just (unwrap args.x), toMaybe args.y] |
| 23 | + where |
| 24 | + args = Open.coerce args' :: Args a |
| 25 | + |
| 26 | +test :: Effect Unit |
| 27 | +test = do |
| 28 | + assert $ |
| 29 | + closedConsumer { x: "foo", z: 42 } == show ["foo"] |
| 30 | + assert $ |
| 31 | + closedConsumer { x: "foo", y: "bar", z: 42 } == show ["foo", "bar"] |
| 32 | + assert $ |
| 33 | + closedConsumer { x: true, z: 42 } == show [true] |
| 34 | + assert $ |
| 35 | + closedConsumer { x: true, y: false, z: 42 } == show [true, false] |
| 36 | + assert $ -- Make sure explicitly wrapping the field in `Req` also works |
| 37 | + closedConsumer { x: Req 5, z: 42 } == show [5] |
| 38 | + |
| 39 | + assert $ |
| 40 | + openConsumer { x: "foo", z: 42 } == show ["foo"] |
| 41 | + assert $ |
| 42 | + openConsumer { x: "foo", y: "bar", z: 42 } == show ["foo", "bar"] |
| 43 | + assert $ |
| 44 | + openConsumer { x: true, z: 42 } == show [true] |
| 45 | + assert $ |
| 46 | + openConsumer { x: true, y: false, z: 42 } == show [true, false] |
| 47 | + assert $ -- Make sure explicitly wrapping the field in `Req` also works |
| 48 | + openConsumer { x: Req 5, z: 42 } == show [5] |
0 commit comments