packages feed

language-c-inline-0.7.6.0: tests/objc/record/Particle.hs

{-# LANGUAGE TemplateHaskell, QuasiQuotes #-}

-- Marshalling a record structure

module Particle (objc_initialise) where

  -- language-c-inline
import Language.C.Quote.ObjC
import Language.C.Inline.ObjC

objc_import ["<Foundation/Foundation.h>"]


-- Haskell code used from Objective-C.

type Point = (Float, Float)

origin = (0, 0)

newtype Vector = Vector (Float, Float)

zero = Vector (0, 0)

data Particle = Particle 
                { mass :: Float
                , loc  :: Point
                , vel  :: Vector
                , acc  :: Vector
                }

newParticle :: Float -> Particle
newParticle mass = Particle mass origin zero zero

objc_record "" "Particle" ''Particle [Typed 'newParticle]
  [ [objcprop| @property (readonly) float mass; |] --> 'mass
  , [objcprop| @property (readonly) float locX; |] ==> ([t| Float |], 
                                                        [|  fst . loc |], 
                                                        [|  \p locX -> p { loc = (locX, snd . loc $ p) } |])
  , [objcprop| @property (readonly) float locY; |] ==> ([t| Float |], 
                                                        [|  snd . loc |], 
                                                        [|  \p locY -> p { loc = (fst . loc $ p, locY) } |])
  ]
  [objcifdecls|
    + (instancetype)particleWithMass:(float)mass;
  |] 
  [objcimdecls|
    + (instancetype)particleWithMass:(float)mass
    {
      return [[Particle alloc] initWithParticleHsPtr:newParticle(mass)];
    }
  |]

objc_emit