mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			129 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			129 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| module ReactiveJQueryTest where
 | |
| 
 | |
| import Prelude ((+), (++), (<$>), (<*>), ($), (<<<), flip, return, show)
 | |
| import Control.Monad
 | |
| import Control.Monad.Eff
 | |
| import Control.Monad.JQuery
 | |
| import Control.Reactive
 | |
| import Control.Reactive.JQuery
 | |
| import Data.Array (map, head, length)
 | |
| import Data.Foldable
 | |
| import Data.Foreign
 | |
| import Data.Maybe
 | |
| import Data.Monoid
 | |
| import Data.Traversable
 | |
| import Debug.Trace
 | |
| import Global (parseInt)
 | |
| 
 | |
| main = do
 | |
|   personDemo
 | |
|   todoListDemo
 | |
| 
 | |
| greet firstName lastName = "Hello, " ++ firstName ++ " " ++ lastName ++ "!"
 | |
| 
 | |
| personDemo = do
 | |
|   -- Create new reactive variables to hold the user's names
 | |
|   firstName <- newRVar "John"
 | |
|   lastName <- newRVar "Smith"
 | |
| 
 | |
|   -- Get the document body
 | |
|   b <- body
 | |
| 
 | |
|   -- Create a text box for the first name
 | |
|   firstNameDiv <- create "<div>"
 | |
|   firstNameInput <- create "<input>"
 | |
|   "First Name: " `appendText` firstNameDiv
 | |
|   firstNameInput `append` firstNameDiv
 | |
|   firstNameDiv `append` b
 | |
| 
 | |
|   -- Create a text box for the last name
 | |
|   lastNameDiv <- create "<div>"
 | |
|   lastNameInput <- create "<input>"
 | |
|   "Last Name: " `appendText` lastNameDiv
 | |
|   lastNameInput `append` lastNameDiv
 | |
|   lastNameDiv `append` b
 | |
| 
 | |
|   -- Bind the text box values to the name variables
 | |
|   bindValueTwoWay firstName firstNameInput
 | |
|   bindValueTwoWay lastName lastNameInput
 | |
| 
 | |
|   -- Create a paragraph to display a greeting
 | |
|   greeting <- create "<p>"
 | |
|   { color: "red" } `css` greeting
 | |
|   greeting `append` b
 | |
| 
 | |
|   -- Bind the text property of the greeting paragraph to a computed property
 | |
|   let greetingC = greet <$> toComputed firstName <*> toComputed lastName
 | |
|   bindTextOneWay greetingC greeting
 | |
| 
 | |
| todoListDemo = do
 | |
|   -- Get the document body
 | |
|   b <- body
 | |
| 
 | |
|   -- Create an array
 | |
|   arr <- newRArray
 | |
| 
 | |
|   text1 <- newRVar "Learn PureScript"
 | |
|   comp1 <- newRVar false
 | |
|   insertRArray arr { text: text1, completed: comp1 } 0
 | |
|   
 | |
|   ul <- create "<ul>"
 | |
| 
 | |
|   -- Bind the ul to the array
 | |
|   bindArray arr ul $ \entry indexR -> do
 | |
|     li <- create "<li>"
 | |
| 
 | |
|     completedInput <- create "<input>"
 | |
|     setAttr "type" "checkbox" completedInput
 | |
|     completedInput `append` li
 | |
|     sub1 <- bindCheckedTwoWay entry.completed completedInput
 | |
|     
 | |
|     textInput <- create "<input>"
 | |
|     textInput `append` li
 | |
|     sub2 <- bindValueTwoWay entry.text textInput
 | |
| 
 | |
|     btn <- create "<button>"
 | |
|     "Remove" `appendText` btn
 | |
|     flip (on "click") btn $ do
 | |
|       index <- readRVar indexR
 | |
|       removeRArray arr index
 | |
|     btn `append` li
 | |
| 
 | |
|     return { el: li, subscription: sub1 <> sub2 }
 | |
| 
 | |
|   ul `append` b
 | |
| 
 | |
|   -- Add button
 | |
|   newEntryDiv <- create "<div>"
 | |
|   btn <- create "<button>"
 | |
|   "Add" `appendText` btn
 | |
|   btn `append` newEntryDiv
 | |
|   newEntryDiv `append` b
 | |
| 
 | |
|   flip (on "click") btn $ do
 | |
|     text <- newRVar ""
 | |
|     completed <- newRVar false
 | |
|     arr' <- readRArray arr
 | |
|     insertRArray arr { text: text, completed: completed } (length arr')
 | |
| 
 | |
|   -- Create a paragraph to display the next task
 | |
|   nextTaskLabel <- create "<p>"
 | |
|   nextTaskLabel `append` b
 | |
| 
 | |
|   let nextTask = do
 | |
|     task <- head <$> toComputedArray arr
 | |
|     case task of
 | |
|       Nothing -> return "Done!"
 | |
|       Just { text = text } -> (++) "Next task: " <$> toComputed text
 | |
|   bindTextOneWay nextTask nextTaskLabel
 | |
| 
 | |
|   -- Create a paragraph to display the task counter
 | |
|   counterLabel <- create "<p>"
 | |
|   counterLabel `append` b
 | |
| 
 | |
|   let counter = (flip (++) " tasks remaining") <<< show <$> do
 | |
|     rs <- toComputedArray arr
 | |
|     cs <- map (\c -> if c then 0 else 1) <$> traverse (\entry -> toComputed entry.completed) rs
 | |
|     return $ foldl (+) 0 cs
 | |
|   bindTextOneWay counter counterLabel
 |