Here is a sketch of how it would look like in reagent (ClojureScript)

; -- SOME CONCRETE COMPONENTS

; a component taking a String as a model
(defn hello-component [name]
      [:p "Hello, " name "!"])

; a stateless component using another component
(defn say-hello []
      [hello-component "world"])

; a component taking a ratom (it's a signal in elm speak) as a model
(defn reactive-hello-component [name]
      [:p "Hello, " @name "!"])

; a component taking list of Strings as a model
(defn list-hellos [names]
      (for [n names]
           [hello-component (str "hello " n)]))

; -- GENERIC WRAPPING COMPONENT


; a wrapping components. take list of components as a parameter and wraps them 
in pages
(defn wrap-components [components]
      (fn []
          [:div {:class "components-wrapped-in-pages-so-we-can-swipe-them"}
           (for [c components]
                [:div {:class "page"} c])]))


; -- MAIN VIEW GLUING ALL TOGETHER


(defn main-view []
      (let [reactive-name (ratom "initial-name")
            input-state (ratom "")]
           [:div {:class "some-boilerplate"}

            ; the two lines below are not following re-frame pattern. There are 
there just to express I have the state which changes.  
            [:input {:onchange (fn [value] (!reset input-state value))}] ; 
react to inout changes and pass the value to model (in re-frame instead of 
directly updating the model we would send a signal (as in elm) and have 
subscription react to the signal but for simplicity I ommit the patern)
            [:button {:onclick #(!reset reactive-name @input-state)}] ; copy 
the states on button click

            [:span {:class 
"here-come-generic-swipe-able-pages-wrapping-any-components"}

             ; here is the usage of the wrapping container
             (wrap-components [
                               say-hello ; stateless component
                               #(hello-component "some-fancy-name") ; #(...) is 
lambda in clojure, here we close over some static state
                               #(reactive-hello-component reactive-name) ; 
#(...) here we close over some reactive state, so the component re-renders when 
the model (state) changes
                               #(list-hellos ["a" "b" "c"]) ; component taking 
list as a state (model)
                               ])]]))

; -- MOUNT VIEW TO DOM

; bind the main-view to DOM and start observing deltas to render if needed
(defn ^:export run []
      (r/render [main-view] (js/document.body)))




On Wednesday, 18 May 2016 08:42:45 UTC+1, Peter Damoc wrote:
>
> Can you mock some code that would show how would you like to use this? 
> Imagine that it is already implemented in some library and write against 
> that imaginary library. 
>
>
>
>
> On Tue, May 17, 2016 at 5:36 PM, Daniel Kwiecinski <[email protected] 
> <javascript:>> wrote:
>
>> The problem is that the generic container component (Let's call it C) do 
>> not know about it potential children (let's call them X, Y, Z) . There is 
>> top level component (Let's call it T) which has a knowledge about all of 
>> them (it is the app). The C is in self contained package, you can consider 
>> it to implement material design list view. How Can I implement C so T can 
>> use T with X, Y, Z ?
>>
>> On Tuesday, 17 May 2016 15:09:36 UTC+1, Peter Damoc wrote:
>>>
>>> Hi Daniel, 
>>>
>>> If you have a limited number of components you can unify them into one 
>>> kind of a component. 
>>>
>>> Here is a self contained example that unifies Counter and RandomGif and 
>>> then uses them in a single list. 
>>> https://gist.github.com/pdamoc/aef6306a9001de109aeece37e5627d06
>>>
>>>
>>>
>>>
>>> On Tue, May 17, 2016 at 3:47 PM, Daniel Kwiecinski <
>>> [email protected]> wrote:
>>>
>>>> So let me expand my scenario a little bit. Lets assume that the 
>>>> CounterList component is very feature heavy. It makes lots of work to 
>>>> layout its children, manages drag to sort or whatever fancy stuff you can 
>>>> imagine. Now in my app I have many instances of usage of CounterList and I 
>>>> want to apply the complex behaviour not only to counters but also to gif 
>>>> and to mixed counters with gifs and many many other possible 
>>>> configurations 
>>>> (think in hundreds). I don't really want to implement dedicated 
>>>> CounterList, GifList, 2GifsWith3CountersList and other few hundreds 
>>>> SomethingBlaBlaList.
>>>> Is it possible in elm at all? If yes how so?
>>>>
>>>> P.S. It is not imaginary question. I try to port existing application 
>>>> implemented in Re-Frame (ClojureScript framework) in which this scenario 
>>>> is 
>>>> trivial.
>>>>
>>>>
>>>> On Tuesday, 17 May 2016 13:33:27 UTC+1, Wil C wrote:
>>>>>
>>>>> Daniel,
>>>>>
>>>>> I think normally, you don't. I think the constraint here is that you 
>>>>> need to explicitly set the types of each of the sub-components for every 
>>>>> component that you make for a page. In the example that you give, you'd 
>>>>> actually need to create 4 types of components: TopLevel, Counter, 
>>>>> CounterList, and Gif. 
>>>>>
>>>>> TopLevel component would include CounterList and Gif. And then 
>>>>> CounterList would contain Counters. It is CounterList's job to 
>>>>> dynamically 
>>>>> keep track of the number of Counters. That way, you don't need a generic 
>>>>> component to contain an unknown number of things with unknown types. And 
>>>>> then if those components need to talk to each other (Like once you add 5 
>>>>> or 
>>>>> more counters, you see a funny cat gif), I believe you can send messages 
>>>>> through Cmds (in 0.17) or Effects (in <0.17). 
>>>>>
>>>>> With the hierarchical thinking of laying out components, I found that 
>>>>> Thinking 
>>>>> in React 
>>>>> <https://facebook.github.io/react/docs/thinking-in-react.html> helps. 
>>>>>
>>>>> If you find that you really need the flexibility of having different 
>>>>> components in a container, it's doable. But it comes at a cost. 
>>>>> Generally, 
>>>>> if you're making a web app of some sort, it's not needed. I cover entity 
>>>>> component systems recently in another thread, and it's for games.
>>>>>
>>>>> https://groups.google.com/forum/#!topic/elm-discuss/c9MhBzVPbr8
>>>>>
>>>>> Wil
>>>>>
>>>>> On Tuesday, May 17, 2016 at 5:13:56 AM UTC-7, Daniel Kwiecinski wrote:
>>>>>>
>>>>>> Hi Elmers,
>>>>>>
>>>>>>
>>>>>> Here is my scenario. Say I have Main.elm which defines main view form 
>>>>>> my application. I also have bunch of other components (with their 
>>>>>> corresponding model  and message types) say Counter and Gif. 
>>>>>> (
>>>>>> https://github.com/evancz/elm-architecture-tutorial/blob/master/nesting/Gif.elm
>>>>>> )
>>>>>> (
>>>>>> https://github.com/evancz/elm-architecture-tutorial/blob/master/nesting/Counter.elm
>>>>>> )
>>>>>> Now I'd like to create new generic component which as a parameter 
>>>>>> (initial value of its model?) takes list of any type of component (say 
>>>>>> two 
>>>>>> counters, then one gif and another three counters) and wraps them into 
>>>>>> some 
>>>>>> decorating html.
>>>>>> The scenario serves as a illustration of the question, how do I 
>>>>>> implement components which can wrap lists of arbitrary component types.
>>>>>>
>>>>>> --
>>>>>> Regards,
>>>>>> Daniel
>>>>>>
>>>>> -- 
>>>> You received this message because you are subscribed to the Google 
>>>> Groups "Elm Discuss" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send 
>>>> an email to [email protected].
>>>> For more options, visit https://groups.google.com/d/optout.
>>>>
>>>
>>>
>>>
>>> -- 
>>> There is NO FATE, we are the creators.
>>> blog: http://damoc.ro/
>>>
>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "Elm Discuss" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to [email protected] <javascript:>.
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>
>
> -- 
> There is NO FATE, we are the creators.
> blog: http://damoc.ro/
>

-- 
You received this message because you are subscribed to the Google Groups "Elm 
Discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to