module Main where import Prelude data Z data S n data ArrayBox n a = ArrayBox [a] nil :: forall a. ArrayBox Z a nil = ArrayBox [] foreign import concat """ function concat(l1) { return function(l2) { return l1.concat(l2); }; } """ :: forall a. [a] -> [a] -> [a] cons' :: forall a n. a -> ArrayBox n a -> ArrayBox (S n) a cons' x (ArrayBox xs) = ArrayBox $ concat [x] xs foreign import error """ function error(msg) { throw msg; } """ :: forall a. String -> a main = case cons' 1 $ cons' 2 $ cons' 3 nil of ArrayBox [1, 2, 3] -> Debug.Trace.trace "Done" _ -> error "Failed"